2015-05-25 153 views
7

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")) 

我需要從包含該術語「鬆」列表中完全刪除那些元素。

期望的答案是一個列表:

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

感謝

回答

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

你可以嘗試Filter這裏

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

另外一個可以執行:

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

這是一個古老的問題,但我想我會添加另一個選項。 stringr包中的「str_」函數非常適合列表中的模式匹配。

如果你正在尋找一個比賽你可以使用所有列表中的條目:

library(stringr) 
str_subset(var1,pattern="pine") 

但由於所需的列表條目的比賽,你可以使用:

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

str_detect(list,pattern)返回邏輯列表,因此您可以使用反(!)將您的列表分類到與模式不匹配的條目。