从多个cor.test()中提取估计值和P值会导致R

时间:2019-03-18 19:30:40

标签: r function lapply readxl

我有一个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循环而不是应用来运行多个相关性测试,但我无法似乎可以计算出等效的代码。

更新/编辑

以下用户 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))

1 个答案:

答案 0 :(得分:0)

考虑使用sapply作为相关结果的矩阵输出(即 s 的简化版本),并在返回位置调整转置对象和转置t()。结束:

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))

Rextester Demo