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

Pau*_*sen 9 r

可能重复:
R分组功能:sapply vs. lapply与apply.vs. tapply vs. by vs. aggregate vs.

我正在使用R,并希望得到一些我正在遇到的问题的帮助:

我有一个df带有列ID和列Emotion 的dataframe().ID中的每个值对应Emotion中的40-300个值(因此它不是设定的数字).我需要计算Emotion每个j in 的所有i的平均值ID.所以这就是数据的样子

df$ID = (1, 1, 1, 1, 2, 2, 3)
df$Emotion = (2, 4, 6, 4, 1, 1, 8)
Run Code Online (Sandbox Code Playgroud)

因此,手段的向量应如下所示: (4, 1, 8)

任何帮助将不胜感激!

Jil*_*ina 20

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

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

sapply(split(df$Emotion, df$ID), mean) 
1 2 3 
4 1 8 
Run Code Online (Sandbox Code Playgroud)

有很多方法可以做到这一点,包括ddply从plyr包,data.table包,其他的组合splitlapply,dcast从reshape2包.有关更多解决方案,请参阅此问

  • 我经常做的是接近投票并提供快速回答.这样,如果有人偶然发现问题,那么这个问题就有了一些价值.此外,有人回答这个问题可能不会影响它再次发生的可能性.如果问题被认为是重复的,SO系统可以进行清理.我同意你的信息,但反对低估与你做出不同选择的人. (5认同)

42-*_*42- 11

这正是这项工作的tapply目的.

tapply(df$ID , df$Emotion, mean) 
Run Code Online (Sandbox Code Playgroud)

  • @MatthewDowle Downvoting 不用于此目的!虽然我同意不鼓励鼓励重复,但在 Meta 和 SE 博客上有一个强有力的论点,即重复不是问题,回答它们是可以的。原因是,一个人可能有一个问题,行家知道它是重复的,但无法将问题放入 [so] 上已经提出的问题中使用的相同词中。当然,必须找到一个平衡...... (3认同)