dplyr::arrange中结合base::ifelse实现分组行条件排序的方法
你原来的写法出问题的核心是:ifelse要求两个分支返回的向量类型匹配,你在第二个分支传入desc(ite),返回的是带排序标记的特殊向量,和第一个分支的字符型ite合并时会被强制转为普通字符,等于最终给arrange的参数就是普通的ite列,自然不会对ori=r的组倒序。
接下来给两种适用不同场景的解法:
解法1:组内ori取值统一的场景(你的示例属于这种)
因为你每个分组的ori值完全相同,可以直接取组内第一个ori值做分支判断,不用逐行的ifelse:
library(dplyr) df %>% group_by(grp) %>% arrange(if (first(ori) == "f") ite else desc(ite), .by_group = TRUE) %>% ungroup()
解法2:组内ori可能不一致的通用场景
通过生成排序权重的方式实现逐行控制排序方向,xtfrm可以把任意可排序的对象转为对应排序权重的数值向量,正负值控制升降序:
library(dplyr) df %>% arrange( grp, ifelse(ori == "f", xtfrm(ite), -xtfrm(ite)) )
两种方法运行后都可以得到你期望的结果:
grp ori ite 1 1 f A 2 1 f B 3 1 f C 4 2 r C 5 2 r B 6 2 r A
内容的提问来源于stack exchange,提问作者Dunois
相关产品推荐
相关产品推荐

