You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复dplyr中按复杂条件排序arrange函数的失效问题

修复dplyr arrange排序代码的方法

原代码的问题在于误用了dplyr的列选择函数:contains()和everything()是用来筛选数据框列名的工具,不能直接用来生成匹配行中item值的向量,因此会导致运行报错。

下面提供两种可行的修复方案:

方案一:用case_when定义排序优先级

通过给不同类型的item分配优先级数值,让arrange按优先级排序,同优先级内还可按需对item本身排序:

library(tidyverse)

raw_data <- data.frame(item=c('cat_b','cab_a','cat_w','total','sub_1','other_1','sub_2','t_1'),
                       value=c(1,2,4,3,5,9,10,8))

# 修复后的排序代码
raw_data %>% 
  arrange(
    # 定义排序优先级:total > cat_开头 > sub_开头 > 其他
    case_when(
      item == 'total' ~ 1,
      str_detect(item, 'cat_') ~ 2,
      str_detect(item, 'sub_') ~ 3,
      TRUE ~ 4
    ),
    item # 同优先级内按item字符串排序,可根据需求删除
  )

方案二:分组合并数据框

先分别筛选出不同类型的行,再按要求的顺序拼接起来:

library(tidyverse)

raw_data <- data.frame(item=c('cat_b','cab_a','cat_w','total','sub_1','other_1','sub_2','t_1'),
                       value=c(1,2,4,3,5,9,10,8))

# 修复后的拼接排序代码
raw_data %>% filter(item == 'total') %>% 
  bind_rows(raw_data %>% filter(str_detect(item, 'cat_'))) %>% 
  bind_rows(raw_data %>% filter(str_detect(item, 'sub_'))) %>% 
  bind_rows(raw_data %>% filter(!item == 'total' & !str_detect(item, 'cat_') & !str_detect(item, 'sub_')))

两种方案都能实现需求:total行排在首位,接着是含cat_的行,然后是含sub_的行,最后是其他行。

内容的提问来源于stack exchange,提问作者anderwyang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:47:11