如何在R中按组计算分离重复值的累积分布(替代cume_dist)
自定义分组累计分布(分离重复值)
原始数据集
dat <- data.frame(YEAR = c(rep(1999,4),rep(2002,3)), VALUE = c(1,2,3,2,1,2,3))
需求说明
需要按YEAR分组后,为VALUE新增一列标记组内位置:功能类似dplyr的cume_dist(),但要分离重复值。例如对序列1,2,2,3,cume_dist()返回0.25,0.75,0.75,1.00,我们需要的结果是0.25,0.50,0.75,1.00。
已尝试的代码
- 使用
cume_dist()无法区分重复值:
dat %>% group_by(YEAR) %>% mutate(cumdist = cume_dist(VALUE))
- 使用
row_number(VALUE)能得到正确的排名分子(每组内的位次,重复值也会按出现顺序分配不同排名):
dat %>% group_by(YEAR) %>% mutate(rownumber = row_number(VALUE))
解决方案
核心是用dplyr的n()函数获取当前组的行数,再将row_number(VALUE)的结果除以n()即可:
library(dplyr) dat %>% group_by(YEAR) %>% mutate(cumdist_custom = row_number(VALUE) / n()) %>% ungroup() # 可选,处理完后取消分组状态
结果验证
运行后得到的cumdist_custom列完全符合需求:
- 1999组(4条数据):
0.25, 0.5, 0.75, 1 - 2002组(3条数据):
0.3333333, 0.6666667, 1
内容的提问来源于stack exchange,提问作者chill
相关产品推荐
相关产品推荐

