![](/img/trans.png)
[英]How can I calculate the studentized residual per observation by group in R?
[英]How to calculate value for an observation by group?
我有一個這樣的數據框:
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
任何想法或指向正確方向的指針都值得贊賞。
怎么樣:
mydf$score - tapply(mydf$score, mydf$group, mean)[as.character(mydf$group)]
tapply
工作原理與by
相同by
但輸出效果更好。 [as.character(mydf$group)]
子集並復制tapply
的輸出,以便它與mdf$group
對齊。
library(dplyr)
mydf %>% group_by(group) %>% mutate(residual = score - mean(score))
我對數據進行group
,然后添加一列(使用mutate
),該列是變量score
與每個組中該變量的平均值之間的差。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.