You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dplyr链式操作中统计字符串按分隔符拆分后的子串数量

问题原因

str_split()对向量输入会返回一个列表,列表总长度等于输入的y列的行数(本案例为3),你直接对整个列表取length()得到的是列表本身的长度3,mutate会把这个值循环填充到所有行,所以所有行的z值都返回3。


正确实现方案

下面是几种可在dplyr链式操作中使用的实现方法:

方法1:统计分隔符数量(最高效)

不需要拆分字符串,直接统计分号的数量加1即可,原理是n个元素用分号分隔时,分号数量固定为n-1,适合处理大数据量场景:

library(dplyr)
library(stringr)

mydf <- mydf %>% 
  mutate(z = str_count(y, ';') + 1)

方法2:结合purrr::map_int逐元素取长度

如果需要先拆分字符串做后续其他处理,可用map_int遍历拆分后的列表,逐行取子向量长度:

library(dplyr)
library(stringr)
library(purrr)

# 分隔符匹配分号加空格,避免拆分后的子串带前导空格
mydf <- mydf %>% 
  mutate(z = map_int(str_split(y, '; '), length))

方法3:用rowwise逐行运算

不想引入purrr依赖的话,可以用dplyr的行分组实现逐行计算:

library(dplyr)
library(stringr)

mydf <- mydf %>% 
  rowwise() %>% 
  mutate(z = length(str_split(y, '; ', simplify = TRUE))) %>% 
  ungroup() # 处理完成后取消行分组,避免影响后续操作

内容的提问来源于stack exchange,提问作者Doug Fir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:24:02