R语言分割字符串为向量并移除空字符串的问题求解
问题原因
你的代码不生效有两个核心问题:
strsplit()返回结果是列表类型,你用[1]取到的仍然是嵌套的列表元素,不是拆分后生成的原子字符向量,后续所有空值筛选操作都是作用在外层长度为1的列表上,根本没有触达列表内部存储的拆分结果,自然无法移除空字符串。stringi::stri_remove_empty_na()要求输入为原子向量,你传入嵌套列表会触发类型不匹配的警告,强制转换也无法得到预期结果。
正确实现代码
首先拆分字符串时要用[[1]]提取列表内的字符向量,而非[1]取嵌套子列表,再做非空筛选即可:
params <- "-item1-map-item2-" # 提取拆分后的原子字符向量 split_res <- strsplit(params, "-")[[1]] # 筛选非空元素,两种方法二选一 # 方法1:R原生函数,无需依赖第三方包 param_vec <- split_res[nzchar(split_res)] # 方法2:使用stringi函数,注意传入的是原子向量 # param_vec <- stringi::stri_remove_empty_na(split_res)
运行后param_vec的输出为[1] "item1" "map" "item2",首尾空字符串已被移除。
如果你需要最终结果为列表格式,筛选完成后再转列表即可:
param_list <- as.list(param_vec)
之前筛选失效的具体说明
你之前运行
param_list[nzchar(param_list) & complete.cases(param_list)]时,param_list是长度为1的列表,唯一的元素是包含空串的字符向量,nzchar()判断列表对象本身不会返回空匹配,因此筛选后列表没有任何变化,内部存储的空字符串自然也不会被移除。
内容的提问来源于stack exchange,提问作者monkey
相关产品推荐
相关产品推荐

