如何在R中按项目分组计算用户贡献值的百分位排名
在R中按项目分组计算用户贡献值的百分位排名
我有如下结构的数据集(实际包含更多条目),需要新增一列Column D,用来计算每个用户在所属项目中基于贡献值的百分位排名。比如user2参与了3个项目,他在Project2的贡献远高于Project3和其他项目,新列要能展示该用户在各项目中的不同百分位排名。我试过group_by %>% summarize的各种写法都没成功,也不熟悉自定义函数,希望找现成的实现方法。
数据集结构示例:
| User | ProjectName | Contributions |
|---|---|---|
| user1 | Project1 | 1 |
| user2 | Project1 | 1 |
| user2 | Project2 | 2937533 |
| user2 | Project3 | 15 |
| user3 | Project4 | 8 |
| user4 | Project3 | 2 |
| user5 | Project6 | 277 |
| user5 | Project2 | 2 |
解决方案
用dplyr包就能轻松实现,核心是按项目分组后,用内置的percent_rank()函数计算百分位排名,不用写自定义函数。步骤如下:
- 先加载
dplyr包(如果没安装先运行install.packages("dplyr")) - 按
ProjectName分组,然后用mutate新增列,计算每个用户在对应项目中的贡献值百分位排名
完整代码示例
# 安装并加载dplyr包 if (!require(dplyr)) { install.packages("dplyr") library(dplyr) } # 创建示例数据集 df <- tibble( User = c("user1", "user2", "user2", "user2", "user3", "user4", "user5", "user5"), ProjectName = c("Project1", "Project1", "Project2", "Project3", "Project4", "Project3", "Project6", "Project2"), Contributions = c(1, 1, 2937533, 15, 8, 2, 277, 2) ) # 新增Column D:按项目分组计算百分位排名(结果为0-100的百分比) df <- df %>% group_by(ProjectName) %>% mutate(`Column D` = percent_rank(Contributions) * 100) %>% ungroup() # 查看结果 print(df)
代码解释
group_by(ProjectName):把数据按项目分组,确保每个项目内的排名独立计算percent_rank(Contributions):计算当前行的贡献值在所在项目中的相对百分位(返回0到1之间的数值),乘以100后转换成百分比形式ungroup():取消分组,避免后续操作受分组影响
运行后你会看到:
- user2在Project2的
Column D是100(因为他的贡献是该项目最高),在Project3是100,在Project1是50(和user1贡献相同,平分百分位) - user5在Project2的
Column D是0,在Project6是100(该项目只有他一个人)
可选:获取排名位次而非百分比
如果你想要的是排名位次(比如第1名、第2名)而不是百分比,可以把percent_rank(Contributions)*100换成rank(desc(Contributions), ties.method = "average"),这样会得到每个用户在项目中的排名,相同贡献的用户会得到平均排名。
替换后的代码:
df <- df %>% group_by(ProjectName) %>% mutate(`Column D` = rank(desc(Contributions), ties.method = "average")) %>% ungroup()
这样user1和user2在Project1的排名都是1.5,user2在Project2是第1名,user5是第2名。
内容的提问来源于stack exchange,提问作者hesmith
相关产品推荐
相关产品推荐

