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

use*_*888 10 r list

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"))
Run Code Online (Sandbox Code Playgroud)

我需要从包含术语"pine"的列表中完全删除这些元素.

想要的答案是一个清单:

[[1]]
[1] "tall tree" "fruits"    "star"    
[[2]]
[1] "apple"  "orange" "grapes"
Run Code Online (Sandbox Code Playgroud)

谢谢

Dav*_*urg 13

你可以试试Filter这里

Filter(function(x) !any(grepl("pine", x)), var1)
# [[1]]
# [1] "tall tree" "fruits"    "star"     
# 
# [[2]]
# [1] "apple"  "orange" "grapes"
Run Code Online (Sandbox Code Playgroud)


sco*_*coa 6

var1[lapply(var1,function(x) length(grep("pine",x,value=FALSE))) == 0]
Run Code Online (Sandbox Code Playgroud)


小智 6

这是一个老问题,但我想我会添加另一个选项。stringr 包中的“str_”函数非常适合列表中的模式匹配。

如果您正在寻找匹配的所有列表条目,您可以使用:

library(stringr)
str_subset(var1,pattern="pine")
Run Code Online (Sandbox Code Playgroud)

但由于您想要匹配的列表条目,您可以使用:

library(stringr)
var1[!str_detect(var1,pattern="pine")]
Run Code Online (Sandbox Code Playgroud)

str_detect(list,pattern) 返回一个逻辑列表,因此您可以使用逆 (!) 将列表子集为与模式不匹配的条目。