2015-05-25 2 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

Это старый вопрос, но я думал, что добавлю еще один вариант. Функции «str_» в пакете stringr отлично подходят для сопоставления шаблонов в списках.

Если вы искали все записи списка, которые матч вы могли бы использовать:

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

, но так как вы хотите записи списка, которые сделать не матч, вы можете использовать:

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

str_detect(list,pattern) возвращает список логических элементов, поэтому вы можете использовать инверсную (!) Для подмножества вашего списка для записей, которые не соответствуют шаблону.

Смежные вопросы