在R语言中如何对dataframe(数据框)的数值数据按行排名
Base R 实现
直接通过apply按行处理即可,5000列的场景下也能正常运行:
df= data.frame(a=c(13,17,19,7,9), b=c(1,3,50,NA,3), c=c(NA,NA,NA,NA,9)) df_rank <- as.data.frame(t(apply(df, 1, function(x) { rank(-x, na.last = "keep", ties.method = "dense") })))
输出结果和你给出的预期完全一致。
Tidyverse 实现
如果你习惯使用tidyverse语法,可以用rowwise+c_across实现:
library(dplyr) df_rank <- df %>% rowwise() %>% mutate(across(everything(), ~ rank(-c_across(everything()), na.last = "keep", ties.method = "dense")[cur_column()])) %>% ungroup()
参数说明
- 代码中
-x代表按数值从大到小降序排名,数值最大的单元格排名为1,若需要按从小到大升序排名,去掉负号即可 na.last = "keep"表示保留原数据中的NA值,不参与排名计算ties.method = "dense"表示相同数值的单元格排名一致,排名序号连续无空缺,匹配你给出的示例规则
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

