簡體   English   中英

如何按組計算觀察值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM