【问题标题】:dplyr: calculate group weightsdplyr:计算组权重
【发布时间】:2014-09-29 15:00:08
【问题描述】:

快速提问,如何使用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])) 但不如你的代码优雅
  • 跳过“dplyr”并使用base? prop.table(xtabs(val ~ cat, D))
  • 哎呀,刚刚发生了什么,@AnandaMahto!有趣
  • @DanielKrizian,如果你喜欢“data.table”,你也可以试试:as.data.table(D)[, list(val = sum(val)/sum(D$val)), by = cat]

标签: r dplyr


【解决方案1】:

我会这样写

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))

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2017-09-27
    • 2023-03-28
    • 2015-04-13
    • 2014-05-11
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多