计算列意味着基于另一列中的值

时间:2012-11-16 22:28:03

标签: r

  

可能重复:
  R Grouping functions: sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate vs.

我正在使用R并希望能解决我遇到的问题:

我有一个数据框(df),其中包含列ID和列Emotion。 ID中的每个值对应Emotion中的40-300个值(因此它不是设定的数字)。我需要为Emotion中的每个j计算ID中所有i的平均值。这就是数据的样子

df$ID = (1, 1, 1, 1, 2, 2, 3)
df$Emotion = (2, 4, 6, 4, 1, 1, 8)

因此,平均值的矢量应如下所示:(4, 1, 8)

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:19)

您可以使用aggregate

ID = c(1, 1, 1, 1, 2, 2, 3)
Emotion = c(2, 4, 6, 4, 1, 1, 8)
df <- data.frame(ID, Emotion)


aggregate(.~ID, data=df, mean)
   ID Emotion
1  1       4
2  2       1
3  3       8

sapply也可能有用(这个其他解决方案会给你一个向量)

sapply(split(df$Emotion, df$ID), mean) 
1 2 3 
4 1 8 

有很多方法可以做到这一点,包括来自plyr包的ddply,data.table包,来自reshape2包的splitlapplydcast的其他组合。有关更多解决方案,请参阅this question

答案 1 :(得分:10)

这正是tapply旨在完成的工作。

tapply(df$ID , df$Emotion, mean)