我在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粘贴到一个文本文件中,然后将其修改一下以获得我想要的具有适当名称的摘要统计信息。这感觉非常错误,我想做点更好的事情!
答案 0 :(得分:26)
有很多不同的方法可以将输出从 tapply 调用转换为data.frame。
但是,首先避免 tapply 的调用更简单,并且通过调用返回数据框的类似函数来替换 / em>而不是vector:
更具体地说:
tapply 返回一个向量
聚合 会返回一个数据框
所以只需将您的函数调用从 tapply 更改为聚合,如下所示:
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 :(得分:14)
你可以试试这个:
mn <- tapply(d$score,d$template,mean)
df <- data.frame(template=names(mn),mean=mn)
答案 2 :(得分:8)
library(plyr)
ddply(d, "template", summarise, mean = mean(score))