如何在R中对data.frame行排序:优先保留多列高值行(非求和)
如何让Data框中risk1/risk2/risk3同时具备较高值的行排在顶部?
没问题!我完全理解你的需求——不是简单求和排序,而是要让三个risk列同时没有过低数值、整体偏高的行放在最前面,还要允许像(4,3,2)和(2,3,4)这类排列不同但整体水平相当的行并列。
先看你的原始数据和期望结果:
原始数据
Data <- data.frame(id=1:4,risk1 = c(1,3,5,4), risk2 = c(8,2,1,3), risk3 = c(0,1,4,2))
期望排序结果
Desired_output <- read.table(header=T,text=" id risk1 risk2 risk3 4 4 3 2 3 5 1 4 2 3 2 1 1 1 8 0 ")
解决方案思路
核心思路是:用每行三个risk值的最小值作为首要排序依据——最小值越高,说明这一行的三个值没有特别低的,完美契合"同时较高"的要求;然后用三个值的总和作为次要依据,当最小值相同时,让整体数值更高的行排在前面,正好匹配你给出的期望顺序。
方法一:Base R实现
# 计算每行risk列的最小值和总和 Data$min_risk <- apply(Data[,c("risk1","risk2","risk3")], 1, min) Data$sum_risk <- apply(Data[,c("risk1","risk2","risk3")], 1, sum) # 按min_risk降序、sum_risk降序排序,最后移除辅助列 sorted_Data <- Data[order(-Data$min_risk, -Data$sum_risk), c("id","risk1","risk2","risk3")] # 查看结果 print(sorted_Data)
运行后输出就是你要的Desired_output:
id risk1 risk2 risk3 4 4 4 3 2 3 3 5 1 4 2 2 3 2 1 1 1 1 8 0
方法二:dplyr实现(更简洁直观)
如果你习惯用tidyverse系列的工具,可以用dplyr的行操作来完成:
library(dplyr) sorted_Data <- Data %>% rowwise() %>% # 计算每行的最小risk值和总和 mutate(min_risk = min(c(risk1, risk2, risk3)), sum_risk = sum(c(risk1, risk2, risk3))) %>% ungroup() %>% # 按最小值降序,再按总和降序排列 arrange(desc(min_risk), desc(sum_risk)) %>% # 只保留需要的列 select(id, risk1, risk2, risk3) print(sorted_Data)
灵活调整说明
如果你的"较高值"定义有变化(比如阈值不是基于最小值,而是要求三个值都>=某个数),可以调整排序逻辑。比如你想把三个risk值都>=2的行放在最前面,剩下的按总和排序,只需要修改排序条件即可。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

