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
相关产品推荐
相关产品推荐

