【问题标题】:R: Assigning group value based on subset of that groupR:根据该组的子集分配组值
【发布时间】: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 %&gt;% group_by(A) %&gt;% 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


【解决方案1】:

base R 中一种相当简单的方法是按组计算所需的均值,然后将这些结果合并到原始 data.frame 上。

merge(DF, aggregate(cbind(mean=C)~A, data=DF[DF$B=="Yes",], mean), by="A")
   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

这里的“诀窍”是馈送到aggregate 的 data.frame 仅包含“是”观察结果。


我在 cmets 中的data.table 答案的一个更强大的版本是将.(...) 替换为c(.SD, mean=...),如下所示:

library(data.table)
setDT(DF)[, c(.SD, mean=mean(C[B=="Yes"])), by=A]
    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

此替换将允许传递任何其他变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多