dplyr:计算分组权重

4

快速提问,如何使用dplyr计算组权重?

例如,给定数据:

D = data.frame(cat=rep(LETTERS[1:2], each=2), val=1:4)

#   cat val
# 1   A   1
# 2   A   2
# 3   B   3
# 4   B   4

期望的结果是:
#   cat weight
# 1   A    0.3     # (1+2)/10
# 2   B    0.7     # (3+4)/10

以下内容是否更加简洁明了?

还有比以下内容更加简洁的吗?

D %>% 
  mutate(total=sum(val)) %>% 
  group_by(cat) %>% 
  summarise(weight=sum(val/total))

尝试使用D%>%group_by(cat) %>% summarise(weight=sum(val)/sum(D[,2])),但不如您的代码优雅。 - akrun
3
不使用"dplyr",转而使用基础函数? prop.table(xtabs(val ~ cat, D))。注:此代码用于计算数据框"D"中按类别("cat")汇总的频率表,并计算每个类别的比例。 - A5C1D2H2I1M1N2O1R2T1
哇,@AnandaMahto,刚才发生了什么有趣的事情! - Daniel Krizian
1
@DanielKrizian,如果你喜欢“data.table”,你也可以尝试:as.data.table(D)[, list(val = sum(val)/sum(D$val)), by = cat] - A5C1D2H2I1M1N2O1R2T1
1个回答

11

我会这样写

D <- data.frame(
  cat = rep(LETTERS[1:2], each = 2), 
  val = 1:4
)

D %>% 
  group_by(cat) %>%
  summarise(val = sum(val)) %>%
  mutate(weight =  val / sum(val))

使用count()(仅限于dplyr >= 0.3)和prop.table(),可以稍微简化一下:

D %>% 
  count(cat, wt = val) %>%
  mutate(weight = prop.table(n))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接