【问题标题】:How can I make the output from tapply() into a data.frame如何将 tapply() 的输出转换为 data.frame
【发布时间】:2011-02-06 18:37:53
【问题描述】:

我在 R 中有一个如下所示的 data.frame:

      score    rms  template   aln_id       description
1  -261.410  4.951 2f22A.pdb  2F22A_1 S_00001_0000002_0
2  -231.987 21.813 1wb9A.pdb  1WB9A_4 S_00002_0000002_0
3  -263.722  4.903 2f22A.pdb  2F22A_3 S_00003_0000002_0
4  -269.681 17.732 1wbbA.pdb  1WBBA_6 S_00004_0000002_0
5  -258.621 19.098 1rxqA.pdb  1RXQA_3 S_00005_0000002_0
6  -246.805  6.889 1rxqA.pdb 1RXQA_15 S_00006_0000002_0
7  -281.300 16.262 1wbdA.pdb 1WBDA_11 S_00007_0000002_0
8  -271.666  4.193 2f22A.pdb  2F22A_2 S_00008_0000002_0
9  -277.964 13.066 1wb9A.pdb  1WB9A_5 S_00009_0000002_0
10 -261.024 17.153 1yy9A.pdb  1YY9A_2 S_00001_0000003_0

我可以像这样计算 data.frame 的汇总统计数据:

> tapply( d$score, d$template, mean )
1rxqA.pdb 1wb9A.pdb 1wbbA.pdb 1wbdA.pdb 1yy9A.pdb 2f22A.pdb 
-252.7130 -254.9755 -269.6810 -281.3000 -261.0240 -265.5993 

有没有一种简单的方法可以将此输出强制转换回 data.frame?我希望它有这两列:

d$template
mean

我喜欢 tapply,但现在我正在将来自 tapply 的结果剪切并粘贴到一个文本文件中,然后稍微修改一下以获得我想要的带有适当名称的摘要统计信息。这感觉很不对劲,我想做点更好的!

【问题讨论】:

    标签: r statistics


    【解决方案1】:

    有很多不同的方法可以将 tapply 调用的输出转换为 data.frame。

    但是首先避免调用tapply并用调用返回数据框的类似函数代替它要简单得多/em> 而不是向量:

    更具体地说:

    • tapply 返回一个向量

    • 聚合返回一个数据框

    所以只需将您的函数调用从 tapply 更改为 aggregate,如下所示:

    data(iris)     # in 'datasets' just call 'data' and pass in 'iris' as an argument
    
    tx = tapply(iris$Sepal.Length, list(iris$Species), mean)
    # returns: versicolor  virginica 
                 5.94       6.59 
    
    class(tx)
    # returns: vector
    
    tx = aggregate(iris$Sepal.length, list(iris$Species), mean)
    # returns:
             Group.1    x
         1 versicolor 5.94
         2  virginica 6.59
    
    
    class(tx)
    # returns: data.frame
    

    【讨论】:

    • 天才。这就是答案!
    • (+1) 您也可以考虑将公式方法添加到您的答案中。我认为它更干净,并且列名不会改变。 aggregate(score ~ template, d, mean)
    • 使用公式时,如果对summary感兴趣,想统计NA的个数:aggregate(score ~ template, data=d, FUN=summary, na.rm=FALSE, na.action=na.pass)
    【解决方案2】:

    你可以试试这个:

    mn <- tapply(d$score,d$template,mean)
    df <- data.frame(template=names(mn),mean=mn)
    

    【讨论】:

      【解决方案3】:
      library(plyr)
      ddply(d, "template", summarise, mean = mean(score))
      

      【讨论】:

      • 这会起作用,但 plyr 在大型数据集上往往很慢。根据我的经验,如下所述的聚合效率更高。
      • 这是一个合理的评论,因为 plyr 比聚合灵活得多。未来的版本有望更快。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2011-01-05
      • 2016-10-05
      相关资源
      最近更新 更多