如何计算群组观察值?

时间:2014-12-04 23:03:58

标签: r

我有一个像这样的数据框:

mydf <- data.frame(group=c(rep("a", 4),rep("b", 4), rep("c", 4)), score=sample(1:10, 12, replace=TRUE))
mydf
   group score
1      a    10
2      a     9
3      a     2
4      a     3
5      b     1
6      b    10
7      b     1
8      b    10
9      c     3
10     c     7
11     c     1
12     c     3

我可以像这样计算每组的平均值:

> by(mydf[,c("score")], mydf$group, mean)
mydf$group: a
[1] 6
------------------------------------------------------------------- 
mydf$group: b
[1] 5.5
------------------------------------------------------------------- 
mydf$group: c
[1] 3.5

但我想做的是创建一个新列,称为resdidual,其中包含来自该组平均值的残差。似乎有一些方法可以使用其中一个apply函数来执行此操作,但由于某种原因我无法看到它。

我希望我的最终结果如下:

mydf
   group score residual
1      a    10        4
2      a     9        3
3      a     2       -4
4      a     3       -3
5      b     1     -4.5
6      b    10      4.5
7      b     1     -4.5
8      b    10      4.5
9      c     3      -.5
10     c     7      3.5
11     c     1     -2.5
12     c     3      -.5

赞赏任何有关正确方向的想法或指示。

3 个答案:

答案 0 :(得分:2)

怎么样:

mydf$score - tapply(mydf$score, mydf$group, mean)[as.character(mydf$group)]

tapply的工作方式与by相同,但输出效果更好。 [as.character(mydf$group)]子集并复制tapply的输出,使其与mdf$group对齐。

答案 1 :(得分:2)

 library(dplyr)
mydf %>% group_by(group) %>% mutate(residual = score - mean(score))

我收集数据,我按group分组,然后我添加一列(使用mutate),这是变量score与每个变量的平均值之间的差异基。

答案 2 :(得分:0)

library(hash)
mydf <- data.frame(group=c(rep("a", 4),rep("b", 4), rep("c", 4)), score=sample(1:10, 12, replace=TRUE))
byResult <- by(mydf[,c("score")], mydf$group, mean)
h <- hash(keys= names(byResult), values =byResult)
residualsVar <- apply(mydf,1,function(row){
as.vector(values(h,row[1]))-as.numeric(row[2])
})
df <- cbind(mydf,residualsVar)