2015-05-25 13 views
7

zm1 jest lista:Usuń całe elementy listy, które zawierają pewien ciąg

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

trzeba usunąć te elementy całkowicie z listy, która zawiera określenie „sosna”.

Pożądana odpowiedź jest lista:

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

Dzięki

Odpowiedz

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

można spróbować Filter tutaj

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

Alternatywnie można wykonać:

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

To jest stare pytanie, ale pomyślałem, że dodam kolejną opcję. Funkcje "str_" w pakiecie stringr doskonale nadają się do dopasowywania wzorców na listach.

Jeśli szukałeś dla wszystkich pozycji listy, która mecz można użyć:

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

ale skoro chcesz wpisy listy, która NIE mecz, można użyć:

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

str_detect(list,pattern) zwraca listę logiczną, więc możesz użyć odwrotności (!), Aby podzielić listę na wpisy, które nie pasują do wzorca.

Powiązane problemy