【问题标题】:Export of means in a dataframe generated by describe()在 describe() 生成的数据框中导出均值
【发布时间】:2013-09-19 16:08:37
【问题描述】:

我正在尝试根据因子变量计算许多变量的均值,然后将这些均值导出到数据框中。

library(psych)
DATA = data.frame(labels=c("a","a","a","b","b","b"),data=matrix(1:36,nrow=6))
DATA
descriptivesD <- by(cbind(DATA$data.1, DATA$data.2, DATA$data.3), DATA$label, describe)
descriptivesD

str(descriptivesD)
all.means <- descriptivesD$mean
all.means     

我很确定descriptivesD$mean 的分配是错误的,因为分类变量的每个级别都是一个包含手段的 data.frame,但我不知道如何将它们导出到数据框中。

我的第一个问题是,当我在 by() 中使用函数 mean 而不是 describe 时出现错误。所以我继续描述并尝试导出唯一的平均元素。

理想情况下,我想将平均值保存在数据框中,其中第一列将是计算它们的因子变量的级别,然后每一列将是每个变量的平均值

label data.1 data.2 data.3
a     5      6      1
b     2      5      2

提前谢谢你。

【问题讨论】:

    标签: r export mean


    【解决方案1】:

    输出是list,因此获取信息的一种非常直接的方法是使用lapplysapply

    > lapply(descriptivesD, `[`, "mean")
    $a
       mean
    V1    2
    V2    8
    V3   14
    
    $b
       mean
    V1    5
    V2   11
    V3   17
    
    > sapply(descriptivesD, `[`, "mean")
    $a.mean
    [1]  2  8 14
    
    $b.mean
    [1]  5 11 17
    

    如果您希望它是 data.framematrix,这里有几个选项,它们的主要区别在于呈现方式。

    > do.call(rbind, sapply(descriptivesD, `[`, "mean"))
           [,1] [,2] [,3]
    a.mean    2    8   14
    b.mean    5   11   17
    
    > data.frame(sapply(descriptivesD, `[`, "mean"))
      a.mean b.mean
    1      2      5
    2      8     11
    3     14     17
    
    > do.call(cbind, lapply(descriptivesD, `[`, "mean"))
       mean mean
    V1    2    5
    V2    8   11
    V3   14   17
    

    不过,您也可以使用aggregate 在基础 R 中直接实现这一点:

    > aggregate(cbind(data.1, data.2, data.3) ~ labels, DATA, mean)
      labels data.1 data.2 data.3
    1      a      2      8     14
    2      b      5     11     17
    

    【讨论】:

    • +1 表示聚合!我正准备用ddply 回答,但aggregate 满足了摆脱非用户友好的by 输出的需要!
    【解决方案2】:
    library(data.table)
    dt = data.table(DATA)
    
    dt[, lapply(.SD, mean), by = labels]
    #   labels data.1 data.2 data.3 data.4 data.5 data.6
    #1:      a      2      8     14     20     26     32
    #2:      b      5     11     17     23     29     35
    

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多