R语言字符串按多分隔符拆分并过滤空值 解决purrr::keep报错
报错原因
str_split() 返回的结果是列表结构,每个输入字符串对应列表中的一个元素,单个输入字符串的场景下,返回的是长度为1的列表,列表的第一个元素才是拆分得到的长度为7的字符向量。purrr::keep() 的作用是遍历列表的每一层元素,对每个元素执行传入的断言函数,要求断言函数返回单个TRUE/FALSE。你直接把整个列表传给keep(),断言函数会作用在整个长度为7的字符向量上,返回长度为7的逻辑向量,不符合keep()的参数要求,因此抛出错误。
正确实现方案
分两种场景处理:
单字符串处理场景
你只需要先把列表中存储的拆分结果向量提取出来,再执行过滤即可,还可以同步去除多余空格:
library(stringr) library(purrr) mystring <- "this, this and this, and this, and this." # 方法1:提取向量后过滤空白内容 str_split(mystring, regex(',|and'))[[1]] %>% keep(~ nzchar(trimws(.x))) # 方法2:优化拆分正则,直接匹配分隔符前后的空白,减少后续处理步骤 str_split(mystring, regex('\\s*(,|and)\\s*'))[[1]] %>% keep(nzchar)
两种方法输出结果一致:
[1] "this" "this" "this" "this" "this."
多字符串批量处理场景
如果输入是多个字符串组成的向量,需要用purrr::map()遍历列表中的每个拆分结果,再分别过滤:
# 示例输入为两个相同的字符串 input_vec <- c(mystring, mystring) str_split(input_vec, regex('\\s*(,|and)\\s*')) %>% map(~ keep(.x, nzchar))
内容的提问来源于stack exchange,提问作者ℕʘʘḆḽḘ
相关产品推荐
相关产品推荐

