我有一个像这样的数据框:
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
赞赏任何有关正确方向的想法或指示。
答案 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)