【问题标题】:How do I combine data frames carrying information about multiple statistics across multiple variables and multiple groups?如何组合包含跨多个变量和多个组的多个统计信息的数据框?
【发布时间】:2019-07-22 11:02:46
【问题描述】:

我正在使用以下代码从 mtcars 相关性中计算 Spearman r 值:

 library(plyr)
 library(dplyr)
 mtcars[mtcars==3.440] <- NA
 mtcars[mtcars==4.22] <- NA
 mtcars[mtcars==18.90] <- NA
 selected <- select(mtcars, "cyl", "disp", "wt")
 mtcars$cyl <- as.factor(mtcars$cyl)
 for (i in "cyl") {
 co <- ddply(na.omit(selected), i, function(adf) cor(adf[,2], adf[,3], method ="spearman"))
   names(co) <- c('cyl',paste('CorCol',i, sep='_'))
   if(exists('odf')) { 
     odf <- merge(odf, co, by='cyl', all=TRUE)} else {
     odf <- co } }
 colnames(odf)[colnames(odf)=="CorCol_cyl"] <- "wt"
 selected <- select(mtcars, "cyl", "disp", "qsec")
 for (i in "cyl") {
 co <- ddply(na.omit(selected), i, function(adf) cor(adf[,2], adf[,3], method ="spearman"))
   names(co) <- c('cyl',paste('CorCol',i, sep='_'))
   if(exists('odf')) { 
     odf <- merge(odf, co, by='cyl', all=TRUE)} else {
     odf <- co } }
 colnames(odf)[colnames(odf)=="CorCol_cyl"] <- "qsec"
 selected <- select(mtcars, "cyl", "disp", "drat")
 for (i in "cyl") {
 co <- ddply(na.omit(selected), i, function(adf) cor(adf[,2], adf[,3], method ="spearman"))
   names(co) <- c('cyl',paste('CorCol',i, sep='_'))
   if(exists('odf')) { 
     odf <- merge(odf, co, by='cyl', all=TRUE)} else {
     odf <- co } }
 colnames(odf)[colnames(odf)=="CorCol_cyl"] <- "drat"

这会产生带有 Spearman r 值的数据框:

 > odf
     cyl  wt         qsec        drat
 1   4    0.8181818  0.29696970  -0.41337577
 2   6    0.7181848  0.92763366  -0.29629630
 3   8    0.4453704  0.07734925  -0.05153203

这正是我想要的。但是,我也有兴趣生成两个额外的数据帧,一个是相同的,但不是 Spearman r 值,而是显示 Spearman p 值。另一个也是相同的,但它显示的是样本大小,即每个样本的比较次数。

如果有任何建议,我将不胜感激。谢谢。

【问题讨论】:

    标签: r correlation p-value


    【解决方案1】:

    我提出了一个使用列表列的 解决方案(同时处理所有三个cyl 组):

    • 我使用group_by() 来“循环”三个cyl 组,而不是显式的for 循环。
    • 我使用cor.test,一步即可获得相关性和p 值。 (请注意,由于 mtcars 数据集的关联,我没有使用 Spearman 相关性。您可以根据实际数据集的需要进行调整。)
    • cor.test() 进入summarize() 内部,这会将cyl 的每个唯一值的数据帧减少到一行(具有相关性等)。
    • 我在summarize() 中使用list(),它创建了列表列。
    • 我使用broom::tidy() 很好地一致地格式化cor.test() 的输出。
    • unnest() list-columns 来取回一个没有 list-columns 的普通数据框。
    • 最后一个 select() 只是对列重新排序,以便在下面的输出中显示最相关的列。

    如果你对这些工具不熟悉但对这些工具感兴趣,我建议你看看 R for Data Science 这本书,尤其是Chapter 25 (Many Models)

    library("tidyverse")
    mtcars %>% 
        group_by(cyl) %>% 
        summarize(n = n(),
                  drat = list(cor.test(disp, drat, use = "pair")),
                  wt   = list(cor.test(disp, wt,   use = "pair")),
                  qsec = list(cor.test(disp, qsec, use = "pair"))) %>% 
        mutate_at(vars(drat, wt, qsec), ~map(.x, ~broom::tidy(.x))) %>% 
        unnest(drat, wt, qsec, .sep = "_") %>% 
        select(cyl, n, ends_with("estimate"), ends_with("p.value"), everything())
    #> # A tibble: 3 x 26
    #>     cyl     n drat_estimate wt_estimate qsec_estimate drat_p.value
    #>   <dbl> <int>         <dbl>       <dbl>         <dbl>        <dbl>
    #> 1     4    11       -0.500        0.857         0.328       0.117 
    #> 2     6     7       -0.831        0.473         0.789       0.0205
    #> 3     8    14       -0.0922       0.755         0.195       0.754 
    #> # ... with 20 more variables: wt_p.value <dbl>, qsec_p.value <dbl>,
    #> #   drat_statistic <dbl>, drat_parameter <int>, drat_conf.low <dbl>,
    #> #   drat_conf.high <dbl>, drat_method <chr>, drat_alternative <chr>,
    #> #   wt_statistic <dbl>, wt_parameter <int>, wt_conf.low <dbl>,
    #> #   wt_conf.high <dbl>, wt_method <chr>, wt_alternative <chr>,
    #> #   qsec_statistic <dbl>, qsec_parameter <int>, qsec_conf.low <dbl>,
    #> #   qsec_conf.high <dbl>, qsec_method <chr>, qsec_alternative <chr>
    

    前六行也可以写成如下:

    mtcars %>% 
        add_count(cyl) %>% 
        group_by(cyl, n) %>% 
        summarise_at(vars(drat, wt, qsec), ~list(cor.test(., disp)))
    

    【讨论】:

    • 哇!非常感谢您提供如此有效而详细的答案。如果可以的话,我会给你 10 票。
    • 不客气。您可能会考虑编辑问题的标题,使其更通用且对其他人有用。实际上,您面临的问题并非特定于相关性。也许类似于“我如何组合携带有关跨多个变量和多个组的多个统计信息的数据框?”
    • 太棒了!你说的对。我相应地更改了标题。再次非常感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2010-12-18
    • 2021-12-21
    • 2019-09-04
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多