r - R groupby并计算特殊平均值
问题描述
示例数据框:
id <- c("a","a","a","a","b","b","b")
id2 <- c(1,2,3,4,1,1,2)
value <- c(200,150,250,100,120,60,50)
df = data.frame(id,id2,value)
df
id id2 value adj_val
a 1 200
a 2 150
a 3 250
a 4 100
b 1 120
b 1 60
b 2 50
我想分组id
并找到id2
高于id2
该行的值的总和除以该组的所有值的总和。所以对于上面的例子:
id id2 value adj_val
a 1 200 0.71 # (150+250+100)/(200+150+250+100)
a 2 150 0.5 # (250+100)/(200+150+250+100)
a 3 250 0.14 # (100)/(200+150+250+100)
a 4 100 0 # (0)/(200+150+250+100)
b 1 120 0.22 # (50)/(120+60+50)
b 1 60 0.22 # (50)/(120+60+50)
b 2 50 0 # (0)/(120+60+50)
我怎样才能做到这一点?
解决方案
使用dplyr
and的一种选择purrr
可能是:
df %>%
group_by(id) %>%
mutate(adj_val = map_dbl(.x = seq_along(id2),
~ sum(value[id2 > id2[.x]])/sum(value)))
id id2 value adj_val
<fct> <dbl> <dbl> <dbl>
1 a 1 200 0.714
2 a 2 150 0.5
3 a 3 250 0.143
4 a 4 100 0
5 b 1 120 0.217
6 b 1 60 0.217
7 b 2 50 0
推荐阅读
- amazon-web-services - 调用 terraform 时出现插值错误,而且我不知道如何摆脱它
- security - 如何使用基本身份验证保护 NIFI 站点到站点
- javascript - 使用 JavaScript,我将如何使用数组增加字符串以创建循环?
- android - 寻找 SHA-1 指纹
- amazon-web-services - 为什么 Envoy 使用 AWS 签名代理重复授权标头?
- redis - Redis 服务崩溃并显示“无法打开 RDB 文件 systemdd(在服务器根目录 /etc/cron.d 中)进行保存:权限被拒绝”
- reactjs - 从 parcel v1 -> CRA 切换,如何在开发期间通过重新加载来提供静态 Web 文件
- python - 如何在python中重新连接mongdb?
- php - 输入字段中的日期时间值
- javascript - 在jQuery中上传图像后如何在输入字段中显示图像文件名