如何基于数值向量分割R语言中的不等长字符串?
解决方案
你可以利用stringr包的str_sub函数结合向量操作实现按指定位置分割字符串,以下是具体实现:
代码实现(使用stringr和purrr)
library(stringr) library(purrr) x <- c("11333333444A", "3aaa0085hb", "&ffvyß") y <- c(2, 8, 11, 12) # 生成每个子串的起始和结束位置 starts <- c(1, y[-length(y)] + 1) ends <- y # 定义单个字符串的分割函数 split_single_str <- function(s) { # 提取所有区间的子串 substr_list <- str_sub(s, starts, ends) # 过滤掉空字符串(处理字符串长度不足的情况) substr_list[nzchar(substr_list)] } # 对每个字符串应用分割函数 split_results <- map(x, split_single_str) # 按预期格式输出结果 walk(split_results, ~ cat(paste(.x, collapse = ", "), "\n"))
代码说明
starts构造了每个子串的起始位置:第一个子串从1开始,后续子串的起始为前一个分割结束位置+1;ends直接使用给定的分割位置向量y。str_sub会自动处理超出字符串长度的情况:如果结束位置超过字符串长度,会截取到字符串末尾;如果起始位置超过长度,返回空字符串,后续用nzchar过滤掉这些空值。- 最终输出结果与预期完全一致。
基础R实现(无需额外包)
如果你不想加载第三方包,也可以用基础R实现:
x <- c("11333333444A", "3aaa0085hb", "&ffvyß") y <- c(2, 8, 11, 12) starts <- c(1, y[-length(y)] + 1) ends <- y split_single_str <- function(s) { substr_list <- mapply(function(start, end) substr(s, start, end), starts, ends) substr_list[nzchar(substr_list)] } split_results <- lapply(x, split_single_str) # 输出结果 for(res in split_results) { cat(paste(res, collapse = ", "), "\n") }
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

