如何按元素后附数字对R数据框行内字符串元素降序排序?
解决方案
你可以通过自定义函数提取每个元素后的数字,再按数字降序排序元素并重新拼接,以下是两种实现方式:
方法一:使用tidyverse工具链(dplyr + stringr)
library(dplyr) library(stringr) # 定义处理单条字符串的函数 sort_by_number <- function(str) { if (is.na(str)) return(NA) # 拆分字符串为单个元素 elements <- str_split(str, ", ")[[1]] # 提取每个元素括号内的数字并转为整数 nums <- as.integer(str_extract(elements, "\\((\\d+)\\)", group = 1)) # 按数字降序排序元素 sorted_elements <- elements[order(-nums)] # 重新拼接为字符串 paste(sorted_elements, collapse = ", ") } # 应用函数到数据框的charVar列 df <- df %>% mutate(charVar = map_chr(charVar, sort_by_number))
方法二:使用Base R实现
# 定义处理单条字符串的函数 sort_by_number_base <- function(str) { if (is.na(str)) return(NA) # 拆分字符串为单个元素 elements <- strsplit(str, ", ")[[1]] # 用正则提取括号内的数字并转为整数 nums <- as.integer(regmatches(elements, gregexpr("(?<=\\()\\d+(?=\\))", elements, perl = TRUE))[[1]]) # 按数字降序排序元素 sorted_elements <- elements[order(-nums)] # 重新拼接为字符串 paste(sorted_elements, collapse = ", ") } # 应用函数到charVar列 df$charVar <- sapply(df$charVar, sort_by_number_base)
代码说明
- NA值处理:函数首先判断输入是否为NA,直接返回NA避免报错
- 字符串拆分:将每行的长字符串按
,拆分为独立元素 - 数字提取:通过正则表达式捕获括号内的数字,转为整数类型
- 排序拼接:根据提取的数字降序排列元素,再用
,重新拼接成完整字符串
运行后即可得到你需要的排序结果。
内容的提问来源于stack exchange,提问作者JontroPothon
相关产品推荐
相关产品推荐

