在R语言中移除命名列表里以连字符结尾的元素
解决R语言列表中移除以连字符结尾元素的问题
你的问题出在:当向量中没有匹配-$的元素时,grep("*-$", z)会返回integer(0),此时z[-(integer(0))]会返回空字符向量,而非原向量。另外你写的正则表达式*-$有冗余,*在这里是多余的,直接用-$就能匹配以连字符结尾的字符串。
下面是两种可行的解决方法:
方法一:使用grepl生成逻辑索引
grepl会返回与输入向量长度一致的逻辑向量,匹配成功为TRUE,否则为FALSE,取反后就能筛选出不需要删除的元素:
testlist <- list(test1 = c("hi", "no","yes"), test2 = c("hello", "nein", "never-"), test3 = c("ja")) # 处理列表 result <- lapply(testlist, function(z) z[!grepl("-$", z)]) # 查看结果 result
运行后输出符合预期:
$test1 [1] "hi" "no" "yes" $test2 [1] "hello" "nein" $test3 [1] "ja"
方法二:判断匹配结果后再删除
先获取匹配的索引,只有当存在匹配项时才执行删除操作,否则直接返回原向量:
result <- lapply(testlist, function(z) { match_idx <- grep("-$", z) if (length(match_idx) > 0) { z[-match_idx] } else { z } })
这种方法逻辑更直观,也能避免空索引导致的问题。
内容的提问来源于stack exchange,提问作者KaitS
相关产品推荐
相关产品推荐

