【发布时间】:2017-06-01 17:24:48
【问题描述】:
有没有办法将取自特定组级别的平均值分配给整个组?下面是我正在尝试做的一个示例 - 我正在使用 library(tidyverse)。
给定:
> DF <- data.frame(A = c("P1","P1","P1","P2","P2","P2"), B = c("Yes","Yes","No","Yes","No","No"), C = c(10,10,2,20,3,3))
> DF
A B C
1 P1 Yes 10
2 P1 Yes 10
3 P1 No 2
4 P2 Yes 20
5 P2 No 3
6 P2 No 3
我想根据按“A”分组的 B="Yes" 的平均值创建“均值”:
> DF <- data.frame(A = c("P1","P1","P1","P2","P2","P2"), B = c("Yes","Yes","No","Yes","No","No"), C = c(10,10,2,20,3,3))
> DF
A B C mean
1 P1 Yes 10 10
2 P1 Yes 10 10
3 P1 No 2 10
4 P2 Yes 20 20
5 P2 No 3 20
6 P2 No 3 20
这是我尝试过的:
> DF %>% group_by(A) %>% mutate(temp = ifelse(B=="Yes", 1, 0), s= sum(temp), mean = sum(C*temp)/s)
# A tibble: 6 x 6
A B C temp s mean
<fctr> <fctr> <dbl> <dbl> <dbl> <dbl>
1 P1 Yes 10 1 2 10
2 P1 Yes 10 1 2 10
3 P1 No 2 0 2 10
4 P2 Yes 20 1 1 20
5 P2 No 3 0 1 20
6 P2 No 3 0 1 20
【问题讨论】:
-
你可以这样简化:
DF %>% group_by(A) %>% mutate(mean=mean(C[B=="Yes"])) -
在
data.table中,您可以使用library(data.table); setDT(DF)将DF 转换为data.table,然后使用DF[, .(B=B, C=C, mean=mean(C[B=="Yes"])), by=A]返回您想要的结果。
标签: r group-by aggregate tidyverse