在data.frame中查找平均值

时间:2014-07-03 10:36:32

标签: r dataframe mean

我有这张桌子:

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 中执行此操作的线索。

4 个答案:

答案 0 :(得分:3)

只需使用tapply即可。因此,如果您有一个数据框dd,其中包含三列V1V2V3,那么

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)