R语言dataframe中Logger字符变量按数值逻辑排序问题问询
报错原因
你遇到的报错核心是**%>%管道符用法错误**:%>%默认会将左侧的对象传递给右侧函数的第一个参数,tmp %>% mixedorder(tmp$Logger)等价于执行mixedorder(tmp, tmp$Logger),传入了多余的错误参数,才触发了参数校验失败的报错。
解决方案
方案1:基础R实现(无需额外安装包)
直接拆分Logger字段的下划线前缀,转为数值后作为排序依据即可:
# sub("_.*", "", df$Logger) 会匹配下划线及之后的所有内容替换为空,提取前缀 df_sorted <- df[order(as.numeric(sub("_.*", "", df$Logger))), ]
相同前缀的行会保留原有顺序,符合你后缀排序已经满足要求的前提。
方案2:修正后的mixedorder/str_order用法
如果要使用gtools的mixedorder或stringr的str_order,修正调用方式即可:
# 不用管道的写法 library(gtools) df_sorted <- df[mixedorder(df$Logger), ] # 搭配管道的正确写法,用.指代管道传入的df对象 library(dplyr) df_sorted <- df %>% slice(mixedorder(.$Logger)) # stringr::str_order的正确写法,需加numeric=TRUE参数启用数值排序逻辑 library(stringr) df_sorted <- df %>% slice(str_order(.$Logger, numeric = TRUE))
结果验证
排序后df_sorted$Logger的输出如下,完全符合你的需求:
[1] "119_1" "119_2" "119_3" "119_4" "119_5" "552_1" "552_2" "552_3" "1189_1" "1189_2" "1189_3" "1189_4"
内容的提问来源于stack exchange,提问作者Effigy
相关产品推荐
相关产品推荐

