删除包含特定字符串的整个列表元素

12

var1 是一个列表:

var1 <- list(c("tall tree", "fruits", "star"),  
             c("tree tall", "pine tree", "tree pine", "black forest", "water"), 
             c("apple", "orange", "grapes"), 
             c("ancient pine tree", "all trees"))

我需要完全从列表中删除包含术语“pine”的元素。

期望的答案是一个列表:


[[1]]
[1] "tall tree" "fruits"    "star"    
[[2]]
[1] "apple"  "orange" "grapes"

谢谢

4个回答

16
你可以在这里尝试使用 Filter
Filter(function(x) !any(grepl("pine", x)), var1)
# [[1]]
# [1] "tall tree" "fruits"    "star"     
# 
# [[2]]
# [1] "apple"  "orange" "grapes"

9
var1[lapply(var1,function(x) length(grep("pine",x,value=FALSE))) == 0]

6
这是一个老问题,但我想再提供一个选择。stringr包中的“str_”函数非常适合在列表中进行模式匹配。
如果您想查找所有与之匹配的列表条目,可以使用:
library(stringr)
str_subset(var1,pattern="pine")

但是,由于您想要列出不匹配的条目,因此可以使用以下方法:

library(stringr)
var1[!str_detect(var1,pattern="pine")]

str_detect(list,pattern) 返回一个逻辑值列表,因此你可以使用取反运算符(!)来对不匹配模式的条目进行子集筛选。


0

或者可以执行以下操作:

 var2<-lapply(var1,function(x) if(all(grepl(pattern = "^(?!.*pine).*$",x,perl = T)==T)) return(x) else NA);var2[!is.na(var2)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接