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

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,提问作者ℕʘʘḆḽḘ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:24:00