可能重复:
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)
非常感谢任何帮助!
答案 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包的split
和lapply
,dcast
的其他组合。有关更多解决方案,请参阅this question。
答案 1 :(得分:10)
这正是tapply
旨在完成的工作。
tapply(df$ID , df$Emotion, mean)