如何修复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
相关产品推荐
相关产品推荐

