【问题标题】:lapply and for loop to run a function through a list of data.frames in Rlapply 和 for 循环通过 R 中的 data.frames 列表运行函数
【发布时间】:2019-10-22 01:02:00
【问题描述】:

我有一个 data.frame 列表,我想通过每个 data.frame 运行cor.testdata.frame 有 8 列,我想针对第 8 列的前 7 列中的每一列运行 cor.test

我首先设置了存储数据的列表

estimates = list()
pvalues = list()

然后这里是循环结合lapply

for (i in 1:7){
  corr <- lapply(datalist, function(x) {cor.test(x[,i], x[,8], alternative="two-sided", method="spearman", exact=FALSE, continuity=TRUE)}) 
  estimates= corr$estimate
  pvalues= corr$p.value
}

它运行时没有任何错误,但estimates 显示NULL

其中哪一部分出了问题?我曾经在cor.test 上运行for 循环,或者与lapply 一起运行,从不将它们放在一起。我想知道是否有解决方案或替代方案。谢谢。

【问题讨论】:

  • 自我推销如果您不介意,我已经写了get_var_corr 可以做到这一点。目前在开发者版本中可用manymodelr 可用here
  • 我想您在 cor.test 参数中的意思是 alternative 而不是 alterantive。此外,您可能希望增加您的列表:estimates[[i]]
  • 帮助(参见 ??cor.test)还提到“two.lateral”作为参数。
  • @cbo 我没看到alterantive,是alternative。我不能对list 使用增量,因为那里有 ~500 个data.frame,我已经在for loop 中使用了for (i in 1:7)
  • 我的错,我复制了一个答案。 @Ronak Shah 解决方案是最好的方法。只是为了说明我的观点:for循环中的i可以更改为j,然后递增。结果(对于 lapply, lapply 更快)将与 lapply 相同:在您的情况下,2 个列表包含 500 个元素。 :)

标签: r list dataframe for-loop lapply


【解决方案1】:

我们可以使用sapply,在mtcars 上显示一个示例,其中cor.test 是针对第一列对所有列执行的。

lst <- list(mtcars, mtcars) 

lapply(lst, function(x) t(sapply(x[-8], function(y) {
   val <- cor.test(y, x[[8]], alternative ="two.sided", 
            method="spearman", exact=FALSE, continuity=TRUE)
          c(val$estimate, pval = val$p.value)
})))

[[1]]
#            rho         pval
#mpg   0.7065968 6.176953e-06
#cyl  -0.8137890 1.520674e-08
#disp -0.7236643 2.906504e-06
#hp   -0.7515934 7.247490e-07
#drat  0.4474575 1.021422e-02
#wt   -0.5870162 4.163577e-04
#qsec  0.7915715 6.843882e-08
#am    0.1683451 3.566025e-01
#gear  0.2826617 1.168159e-01
#carb -0.6336948 9.977275e-05

#[[2]]
#            rho         pval
#mpg   0.7065968 6.176953e-06
#cyl  -0.8137890 1.520674e-08
#.....

这将返回您的两列矩阵列表,分别为 estimatep.value

【讨论】:

  • 问题在于mtcarsdata.frame 而不是listdata.frame。所以它对我的问题并没有真正的帮助..
  • @Molly_K 更新了答案。这是你的意思吗?
  • 为什么我之前没有想到这一点。两个功能!优秀!谢谢!
【解决方案2】:

免责声明:此答案使用我也写的manymodelr 的开发者版本。

编辑:您可以使用Maplapply 将其映射到数据框列表,例如:

lst <- list(mtcars, mtcars) #Line copied and pasted from @Ronak Shah's answer
Map(function(x) manymodelr::get_var_corr(x, "mpg",get_all = TRUE,
                         alternative="two.sided",
                         method="spearman",
                         continuity=TRUE,exact=F),lst)

对于单个data.frame 对象,我们可以使用get_var_corr

manymodelr::get_var_corr(mtcars, "mpg",get_all = TRUE,
                         alternative="two.sided",
                          method="spearman",
                          continuity=TRUE,exact=FALSE) 
   #    Comparison_Var Other_Var      p.value Correlation
   # 1             mpg       cyl 4.962301e-13  -0.9108013
   # 2             mpg      disp 6.731078e-13  -0.9088824
   # 3             mpg        hp 5.330559e-12  -0.8946646
   # 4             mpg      drat 5.369227e-05   0.6514555
   # 5             mpg        wt 1.553261e-11  -0.8864220
   # 6             mpg      qsec 7.042244e-03   0.4669358
   # 7             mpg        vs 6.176953e-06   0.7065968
   # 8             mpg        am 8.139885e-04   0.5620057
   # 9             mpg      gear 1.325942e-03   0.5427816
   # 10            mpg      carb 4.385340e-05  -0.6574976

【讨论】:

  • 感谢您的建议,我在安装软件包时确实遇到了问题,所以我目前没有对其进行测试。我使用了devtools 功能install_github。我相信只是一些库没有为manymodelr更新
  • 抱歉,您在安装软件包时遇到问题,您可以在 GitHub 上提出问题,让我知道您遇到的问题。它确实依赖于几个包,尽管您可以按照提示跳过更新其中的许多包。无论如何,请随时使用 Ronak 的答案来节省时间。
【解决方案3】:

purrr 有一些方便的功能可能会使这个操作更简单一些(尽管这是否实际上比 Map/lapply 方式更简单还有待商榷)。使用 Ronak 的示例列表lst

library(purrr)

lst <- list(mtcars, mtcars) 

map2(map(lst, ~.[-8]), map(lst, 8), ~
       map(.x, cor.test, y = .y, 
            alternative = "two.sided", 
            method = "spearman", 
            exact = FALSE, 
            continuity = TRUE) %>% 
       map_dfr(extract, c('estimate', 'p.value'), .id = 'var'))

# [[1]]
# # A tibble: 10 x 3
#    var   estimate      p.value
#    <chr>    <dbl>        <dbl>
#  1 mpg      0.707 0.00000618  
#  2 cyl     -0.814 0.0000000152
#  3 disp    -0.724 0.00000291  
#  4 hp      -0.752 0.000000725 
#  5 drat     0.447 0.0102      
#  6 wt      -0.587 0.000416    
#  7 qsec     0.792 0.0000000684
#  8 am       0.168 0.357       
#  9 gear     0.283 0.117       
# 10 carb    -0.634 0.0000998   
# 
# [[2]]
# # A tibble: 10 x 3
#    var   estimate      p.value
#    <chr>    <dbl>        <dbl>
#  1 mpg      0.707 0.00000618  
#  2 cyl     -0.814 0.0000000152
#  3 disp    -0.724 0.00000291  
#  4 hp      -0.752 0.000000725 
#  5 drat     0.447 0.0102      
#  6 wt      -0.587 0.000416    
#  7 qsec     0.792 0.0000000684
#  8 am       0.168 0.357       
#  9 gear     0.283 0.117       
# 10 carb    -0.634 0.0000998   

【讨论】:

    猜你喜欢
    • 2015-10-12
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2011-01-31
    • 2021-11-14
    相关资源
    最近更新 更多