2015-05-25 20 views
7

var1 là danh sách:Hủy bỏ toàn bộ các yếu tố danh sách có chứa một chuỗi nhất định

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

tôi cần phải loại bỏ những yếu tố hoàn toàn khỏi danh sách, trong đó có thuật ngữ "thông".

Câu trả lời mong muốn là một danh sách:

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

Cảm ơn

Trả lời

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

Bạn có thể thử Filter đây

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

Ngoài ra người ta có thể thực hiện:

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

Đây là một câu hỏi cũ, nhưng tôi nghĩ tôi sẽ thêm một tùy chọn khác. Các hàm "str_" trong gói stringr là rất tốt cho khớp mẫu trong danh sách.

Nếu bạn đang tìm kiếm cho tất cả các mục trong danh sách đó trận đấu bạn có thể sử dụng:

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

nhưng kể từ khi bạn muốn mục danh sách đó không trận đấu, bạn có thể sử dụng:

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

str_detect(list,pattern) trả về danh sách lôgic, vì vậy bạn có thể sử dụng hàm nghịch đảo (!) Để đặt danh sách của bạn thành các mục không khớp với mẫu.

Các vấn đề liên quan