如何按分隔符拆分R字符串向量并按特定规则重排为矩阵
我来帮你搞定这个字符串拆分重排的问题!先从你的简化示例入手,再扩展到你实际的业务场景。
一、实现简化示例的排序效果
你的原始代码已经完成了字符串拆分,现在只需要对每行的非空元素做排序,再填充回原矩阵结构即可。用apply函数就能轻松搞定:
library(stringi) vec = c("b;a;c","a;c","c;b") # 拆分字符串得到初始矩阵 q = stri_split_fixed(vec, ";", simplify = TRUE, fill=T) # 对每行非空元素排序,补全空值后转置回矩阵 sorted_q = t(apply(q, 1, function(x) { # 筛选出当前行的非空元素 non_empty = x[x != ""] # 按字母顺序排序 sorted_elements = sort(non_empty) # 补全空值到原行长度 c(sorted_elements, rep("", length(x) - length(sorted_elements))) })) # 查看结果 sorted_q
运行后得到的结果完全符合你的预期:
[,1] [,2] [,3] [1,] "a" "b" "c" [2,] "a" "c" "" [3,] "b" "c" ""
二、适配实际业务场景:按零售商分组排序
针对你提到的U-Amazon、D-Amazon这类开头带U/D的元素,我们可以先提取零售商名称(去掉前缀的U-或D-),再按零售商分组,组内按字母顺序排序,最后重新整理成矩阵。这里用dplyr辅助分组会更清晰:
library(stringi) library(dplyr) # 模拟你的实际业务向量 vec_real = c( "D-Amazon Marketplace;U-Amazon;D-Amazon", "U-Amazon;D-Amazon Marketplace", "U-Jet;D-Amazon" ) # 把每个字符串拆分成列表 split_list = stri_split_fixed(vec_real, ";") # 定义函数:对单个元素列表按零售商分组排序 sort_by_retailer = function(x) { # 提取零售商核心名称:去掉开头的U-或D-前缀 retailer = sub("^(U|D)-", "", x) # 按零售商分组,组内按元素字母顺序排序 x %>% tibble(element = ., retailer = retailer) %>% group_by(retailer) %>% arrange(element) %>% pull(element) } # 对每个子列表应用分组排序 sorted_list = lapply(split_list, sort_by_retailer) # 找到最长的元素列表长度,统一补全空值后转成矩阵 max_len = max(sapply(sorted_list, length)) result_matrix = do.call(rbind, lapply(sorted_list, function(x) { c(x, rep("", max_len - length(x))) })) # 查看最终结果 result_matrix
运行后会得到按零售商分组排序的矩阵:
[,1] [,2] [,3] [1,] "D-Amazon" "U-Amazon" "D-Amazon Marketplace" [2,] "D-Amazon Marketplace" "U-Amazon" "" [3,] "D-Amazon" "U-Jet" ""
如果觉得分组排序太复杂,也可以直接跳过分组,只按元素的字母顺序排序,代码和简化示例几乎一致,只是排序对象换成了长字符串即可。
内容的提问来源于stack exchange,提问作者Alexey Ferapontov
相关产品推荐
相关产品推荐

