【问题标题】:summary statistics of multiple data frames within a list列表中多个数据框的汇总统计
【发布时间】:2015-07-18 17:35:07
【问题描述】:

如果我有这份清单

set.seed(123)
thelist <- list(a=data.frame(x1=rnorm(10), x2=rnorm(10)),
                b=data.frame(x1=rnorm(10), x2=rnorm(10)),
                c=data.frame(x1=rnorm(10), x2=rnorm(10)))

想要计算每个列表中每一列的平均值,我可以使用以下代码来计算。

sapply(do.call("rbind",thelist),mean)

我如何计算标准偏差,再次为每个列表中的每一列 (a:c),因为 sd 没有等效函数(至少据我所知)?

任何建议将不胜感激。

【问题讨论】:

    标签: r list function


    【解决方案1】:

    基本的 R 解决方案是使用两次sapply

    仅表示它是:

    t(sapply(thelist, sapply, mean))
    

    导致

                x1        x2
    a  0.074625644 0.2086220
    b -0.424558873 0.3220446
    c -0.008715537 0.2216860
    

    如果你想要两个:

    my_summary <- function(x){
      c(mean = mean(x), sd = sd(x))
    }
    
    as.data.frame(lapply(thelist, sapply, my_summary))
    

    导致:

               a.x1     a.x2       b.x1      b.x2         c.x1      c.x2
    mean 0.07462564 0.208622 -0.4245589 0.3220446 -0.008715537 0.2216860
    sd   0.95378405 1.038073  0.9308092 0.5273024  1.082518163 0.8564451
    

    【讨论】:

    • 酷,以前从未见过sapplying sapply
    • 谢谢。最后我想要CI。提供您的功能是完美的。我能够将其修改为 'my_summary
    • @B.Davis 如果您的数据很大,最好只计算一次 meansd,例如 function(x){m &lt;- mean(x); s &lt;- sd(x); c(...)} 您可以将它们放在单独的行中,而不是使用分号,当然。
    • 我的意思是my_summary &lt;- function(x){m &lt;- mean(x); s &lt;- sd(x); c(mean = m, UpperCI = m + 1.96*s, LowerCI = m - 1.96*s)}是你应该使用的函数,否则你在重复计算平均值和sd。
    • 完美。确实,要快得多。
    【解决方案2】:

    首先,我会通过将名称放入一列来使其可堆叠:

    for (i in seq_along(thelist)) thelist[[i]]$dfname <- names(thelist)[i]
    

    然后,用data.table 堆叠取手段:

    require(data.table)
    DT <- rbindlist(thelist)
    
    DT[,lapply(.SD,mean),by=dfname]
    

    给了

       dfname           x1        x2
    1:      a  0.074625644 0.2086220
    2:      b -0.424558873 0.3220446
    3:      c -0.008715537 0.2216860
    

    您也可以考虑使用 summary 函数,尽管它在这里很笨重:

    DT[,as.list(unlist(lapply(.SD,summary))),by=dfname]
    #    dfname x1.Min. x1.1st Qu. x1.Median   x1.Mean x1.3rd Qu. x1.Max. x2.Min. x2.1st Qu. x2.Median x2.Mean x2.3rd Qu. x2.Max.
    # 1:      a  -1.265    -0.5318  -0.07983  0.074630    0.37800   1.715 -1.9670   -0.32690    0.3803  0.2086     0.6505  1.7870
    # 2:      b  -1.687    -1.0570  -0.67700 -0.424600    0.06054   1.254 -0.3805   -0.23680    0.4902  0.3220     0.7883  0.8951
    # 3:      c  -1.265    -0.6377  -0.30540 -0.008716    0.56410   2.169 -1.5490   -0.03929    0.1699  0.2217     0.5018  1.5160
    

    最后,复制my old answer,你可以创建自己的summary-stats函数:

    summaryfun <- function(x) list(mean=mean(x),sd=sd(x))
    DT[,as.list(unlist(lapply(.SD,summaryfun))),by=dfname]
    #    dfname      x1.mean     x1.sd   x2.mean     x2.sd
    # 1:      a  0.074625644 0.9537841 0.2086220 1.0380734
    # 2:      b -0.424558873 0.9308092 0.3220446 0.5273024
    # 3:      c -0.008715537 1.0825182 0.2216860 0.8564451
    

    【讨论】:

      【解决方案3】:

      您可以按照自己的建议组合数据,然后按如下方式汇总:

      thelist_named <- Map(cbind, thelist, nam = names(thelist))
      thelist_binded <- do.call(rbind, thelist_named)
      

      聚合部分:

      my_summary <- function(x){
        c(mean = mean(x), sd = sd(x))
      }
      aggregate(.~nam, thelist_binded, my_summary)
      

      结果:

        nam      x1.mean        x1.sd   x2.mean     x2.sd
      1   a  0.074625644  0.953784051 0.2086220 1.0380734
      2   b -0.424558873  0.930809213 0.3220446 0.5273024
      3   c -0.008715537  1.082518163 0.2216860 0.8564451
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-09
        • 2016-10-12
        • 2019-08-18
        • 1970-01-01
        • 2020-12-03
        • 2021-08-07
        • 1970-01-01
        • 2015-07-31
        相关资源
        最近更新 更多