R语言DataFrame按分组对指定列进行不同方向排序的实现
你提供的示例DataFrame构造代码如下:
dd <- data.frame(a = factor(c("Hi", "Hi", "Low", "Low"), levels = c("Low", "Hi"), ordered = T), b = c(1,2,3,4)) dd # a b # 1 Hi 1 # 2 Hi 2 # 3 Low 3 # 4 Low 4
以下是两种常用的实现方案:
方案1:基础R实现
核心逻辑是通过ifelse构造组内排序权重,Hi组用b原值实现升序,Low组用-b实现降序,外层套order函数完成排序:
dd_sorted <- dd[order(dd$a, ifelse(dd$a == "Hi", dd$b, -dd$b)), ] dd_sorted # a b # 3 Low 4 # 4 Low 3 # 1 Hi 1 # 2 Hi 2
方案2:dplyr(tidyverse生态)实现
用arrange函数搭配条件判断,代码可读性更高,适合复杂多条件排序场景:
library(dplyr) dd_sorted <- dd %>% arrange( # 先按a列默认因子顺序分组 a, # 组内按条件指定排序方向 case_when( a == "Hi" ~ b, a == "Low" ~ -b ) )
补充说明:你构造的a列因子默认排序逻辑为
Low < Hi,如果需要让Hi组排在结果前半部分,只需要调整组排序的参数即可:
基础R:将order第一个参数改为-as.integer(dd$a)
dplyr:将arrange第一个参数改为desc(a)
内容的提问来源于stack exchange,提问作者Justin Dhindsa
相关产品推荐
相关产品推荐

