如何使用dplyr计算指定列在每行所有列中的相对排名
实现方案(dplyr管道流)
推荐用rowwise() + c_across()的组合,逻辑清晰易读,完全符合tidyverse的编码规范:
# 加载dplyr包 library(dplyr) # 示例数据 dat <- data.frame( Iowa = c(11, 12, 15), Wisconsin = c(10, 14, 12), Florida = c(14, 9, 11) ) # 逐行计算Iowa的排名 out <- dat %>% rowwise() %>% # 按值从大到小排名,取Iowa对应的排名位 mutate(IowaRank = rank(-c_across(Iowa:Florida), ties.method = "min")[["Iowa"]]) %>% # 取消行分组,避免影响后续数据处理 ungroup()
逻辑说明
rowwise()开启逐行运算模式,对每一行单独处理c_across(Iowa:Florida)指定把每行的Iowa、Wisconsin、Florida三列的值拼成一个向量参与排名,如果你后续加了其他不需要参与排名的列,调整这个范围即可rank()默认值越小排名越高,加负号-实现值越大排名越靠前,和示例的排名规则匹配ties.method = "min"表示遇到并列值时取最小排名,符合常规排名逻辑,有其他需求可以改成"average"(平均排名)、"max"(最大排名)等参数- 最后用
[["Iowa"]]提取Iowa列对应的排名值即可
运行后得到的out和预期结果完全一致。如果处理超大体量数据想要更高运行效率,可以把rowwise()替换成purrr::pmap_dbl的向量化方案,常规场景下上述方案的可读性和易用性最优。
内容的提问来源于stack exchange,提问作者Natasha R.
相关产品推荐
相关产品推荐

