簡體   English   中英

lapply和for循環通過R中的data.frames列表運行函數

[英]lapply and for loop to run a function through a list of data.frames in R

我有data.frame的名單,我想運行cor.test通過每個data.frame。 data.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

哪一部分出了問題? 我用來運行for遍歷cor.test或運行與lapply ,從來沒有把它們放在一起。 我想知道是否有解決方案或替代方案。 謝謝。

我們可以使用sapply ,在mtcars上顯示一個示例,其中cor.test與第一列的所有列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

免責聲明 :這個答案使用了我也寫過的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

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   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM