我有这张桌子:
3702 GO:0009611 0.682
3711 GO:0009611 35.418
4081 GO:0009611 18.072
3702 GO:0033554 0.400
3702 GO:0006812 0.378
3702 GO:0006412 0.373
3702 GO:0009058 0.346
3702 GO:0051641 0.312
29760 GO:0009611 28.697
我不在乎第一栏。第2列重复了一些值。我想要的是data.frame
,其中第一列是我的初始表的第2列的值,而我输出的第二列是我的第3列的对应平均值初始表。
类似的东西:
GO:0051179 1.7398
GO:0016311 2.1595
GO:0010467 1.45633
GO:0044093 15.483
GO:0006811 2.4175
GO:0044238 0.927667
GO:0006812 3.0138
GO:0006807 1.048
事实上,我使用awk获得了这个输出:
awk '{print $2"\t"$3}' BP.txt | awk '{hash1[$1]+=$2} ; {hash2[$1]+=1} END {for (x in hash1) {print x"\t"hash1[x]/hash2[x]}}'
但没有关于在 R 中执行此操作的线索。
答案 0 :(得分:3)
只需使用tapply
即可。因此,如果您有一个数据框dd
,其中包含三列V1
,V2
和V3
,那么
tapply(dd$V3, dd$V2, mean)
会给你你想要的东西。
答案 1 :(得分:3)
您可以使用data.table
。如果df
是您的data.frame,请执行以下操作
library(data.table) ## 1.9.2+
dt <- as.data.table(df)
dt <- dt[, list(col = mean(col3)), by = col2]
答案 2 :(得分:2)
来自@csgillespie的tapply
的替代方案是by
函数:
by(dd$V3, dd$V2, mean)
答案 3 :(得分:1)
或只是好的aggregate
(假设temp
是您的数据集)
aggregate(V3 ~ V2, temp, mean)