【发布时间】:2019-03-18 19:30:39
【问题描述】:
我有一个包含 54 张工作表的 Excel 工作簿。每张表代表一个国家,是一个 17 x 11 矩阵,其中行是年份,列是经济变量。
我可以使用 readxl 包将 Excel 工作簿引入 R。
sheet_list <- lapply(1:54, function(i) read_excel("FDI-vs-variables.xlsx", sheet = i, na="NA"))
我的数据现在以数据框列表的形式存在,sheet_list,其中每个数据框代表我的工作簿的一张工作表。
接下来,我想对所有工作表/数据框的两个变量进行相关性测试。
例如,所有工作表/数据框中的第三列是 GDP,第八列是营养不良人口的百分比。我可以编写一个函数来抓取工作表/数据框中的相应列并使用该数据运行相关测试。
dfCorTest <- function(df){
rslt <- cor.test(df[[3]],df[[8]], method="kendall",use="pairwise")
return(rslt)
}
然后我使用 lapply 将该函数应用于我的 54 个工作表/数据框列表中的每个工作表/数据框。
cor_results <- lapply(sheet_list, dfCorTest)
这会生成一个列表列表,cor_results,详细说明了 54 次不同 cor.test 运行的结果。
如何从这个列表列表中仅提取相关估计值 (tau) 和 p 值?
我知道您可以使用 $estimate 和 $p.value 调用 cor.test 的具体结果,我可以在 cor_results 列表中这样做,如下所示:
cor_results[[1]]$estimate
cor_results[[1]]$p.value
cor_results[[2]]$estimate
cor_results[[2]]$p.value
...and so on
但是这样做的有效方法是什么?理想情况下,我希望能够写出输出看起来像
的文本文件SheetNo Estimate P-value
1 3.33 0.054
2 -2.76 0.889
... ... ...
54 1.23 0.007
我知道在 How to extract... 中提出了类似的问题,但他们使用 for 循环 而不是 lapply 来运行多个相关测试,我似乎无法算出等价的代码。
更新/编辑
以下用户 Parfait 建议的答案有效(谢谢!)。修改函数返回的内容以及 sapply 和 transpose 的组合:
dfCorTest <- function(df){
rslt <- cor.test(df[[3]], df[[8]], method="kendall", use="pairwise")
return(c(estimate = rslt$estimate,
p.value = rslt$p.value))
}
cor_results <- t(sapply(sheet_list, dfCorTest))
【问题讨论】: