首页 > 解决方案 > 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)

我怎样才能做到这一点?

标签: rdataframe

解决方案


使用dplyrand的一种选择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  

推荐阅读