R语言中按指定模式分割向量并分组拼接元素的实现问题
R 按指定模式位置分组拼接向量元素的解决方案
方案1:基于原有逻辑调整
你现有代码丢失最后一组的核心原因是没有覆盖最后一个foo位置到向量末尾的区间,只需在定位到的模式串位置向量末尾追加「向量总长度+1」作为虚拟结束边界,即可完整覆盖所有分组:
v <- c("foo", "bar1", "bar2", "foo", "bar1", "foo", "bar1", "bar2", "bar3", "foo") # 定位所有foo的位置 b <- which(v == "foo") # 追加虚拟结束位置,覆盖最后一组区间 b_extend <- c(b, length(v) + 1) # 遍历所有分组拼接 result <- sapply(seq_along(b), function(x) paste0(v[b[x]:(b_extend[x+1] - 1)], collapse = ""))
方案2:高性能向量化分组方案(适配大数据量)
无需手动处理边界,也避免了显式循环,通过生成分组标识批量处理,数据量较大时效率更优:
v <- c("foo", "bar1", "bar2", "foo", "bar1", "foo", "bar1", "bar2", "bar3", "foo") # 生成分组ID:每遇到一次foo,分组号+1 group_id <- cumsum(v == "foo") # 按分组批量拼接元素 result <- tapply(v, group_id, paste0, collapse = "") # 如需去掉分组名称,转为纯向量 result <- as.vector(result)
两种方案的输出均符合预期:
print(result) # [1] "foobar1bar2" "foobar1" "foobar1bar2bar3" "foo"
内容的提问来源于stack exchange,提问作者CindyLhasapoo
相关产品推荐
相关产品推荐

