基于条件使用dplyr的arrange对字符列进行动态升降序排序
问题原因
你写的ifelse逻辑无法生效,是因为ifelse是向量化操作,要求返回值类型统一:model是字符串向量,而desc(model)是dplyr封装的降序排序对象,二者无法合并为同一类型的返回值,因此排序逻辑失效。
可行解决方案
不需要拆分合并数据,以下两种写法都可以实现需求:
写法1:按组排序(dplyr 1.0.0及以上版本支持)
利用arrange的.by参数按cond分组后,在组内判断排序方向:
library(dplyr) df %>% arrange( .by = cond, if (cur_group() == "A") model else desc(model) )
写法2:基于排序序号处理(兼容旧版本dplyr)
先把字符串列的字典序转换为数值排名,对cond为B的组取排名的负值实现降序:
df %>% arrange( cond, case_when( cond == "A" ~ rank(model), cond == "B" ~ -rank(model) ) )
输出结果
两种写法运行后得到的结果和你期望的一致:
# A tibble: 8 × 4 model mpg cyl cond <chr> <dbl> <dbl> <chr> 1 Datsun 710 22.8 4 A 2 Hornet 4 Drive 21.4 6 A 3 Mazda RX4 21 6 A 4 Mazda RX4 Wag 21 6 A 5 Valiant 18.1 6 B 6 Merc 240D 24.4 4 B 7 Hornet Sportabout 18.7 8 B 8 Duster 360 14.3 8 B
内容的提问来源于stack exchange,提问作者hmhensen
相关产品推荐
相关产品推荐

