2015-05-26 26 views
5

Tôi đã tìm kiếm SO nhưng không thể tìm thấy câu trả lời có liên quan.Danh sách tìm kiếm và tập hợp con của danh sách

dữ liệu

mẫu:

example.list <- list(list("a",list("b"),list("c")),list("c")) 

Tôi muốn tập hợp con danh sách có chứa chữ "c":

Đây này được chỉ số nút cuối cùng, trong đó có chữ "c":

check.a <- lapply(example.list, function(x) grep("c",x)) 

Tôi sẽ lấy danh sách bằng chỉ mục ở trên như thế nào? Hoặc làm cách nào để lấy danh sách danh sách?

Một phần của việc nhận các nút cuối cùng của danh sách c (1,3) có các nút danh sách trước c (1,2).

EDIT: mong muốn đầu ra: (một cái gì đó như thế này)

[[1]][[3]] 
[[1]][[3]][[1]] 
[1] "c" 


[[2]] 
[[2]][[1]] 
[1] "c" 

Tuy nhiên những gì tôi cần cũng là để hiểu rằng với chỉ mục cung cấp, làm thế nào tôi có thể nhận được các tập hợp con của danh sách lồng nhau? Vui lòng sử dụng check.a.

EDIT 2:

Vì vậy, đây là những chỉ số danh sách đó có thể được sử dụng để tập hợp con các nút danh sách có liên quan:

first.list.index <- which(lapply(lapply(example.list, function(x) grep("c",x)),length)>0) 
last.list.index <- unlist(lapply(example.list, function(x) grep("c",x))) 

Ý tưởng là thế này: (không làm việc, chỉ để chứng minh những gì tôi m sau)

lapply(list(a=first.list.index,b=last.list.index), function(a,b) example.list[[a]][[b]]) 

EDIT 3: (LAST EDIT)

dữ liệu loo thực tế ks như thế này: (Tôi hy vọng giải pháp với việc lập chỉ mục tôi cung cấp, đây là lý do tại sao tôi giảm câu hỏi trên đó)

[[1]] 
[[1]][[1]] 
[1] "a" 

[[1]][[1]]$data 

[[1]][[2]] 
[[1]][[2]][[1]] 
[1] "b" 

[[1]][[1]]$data 

[[1]][[3]] 
[[1]][[3]][[1]] 
[1] "c" 

[[1]][[1]]$data 


[[2]] 
[[2]][[1]] 
[1] "c" 

[[2]][[1]]$data 

Xin lỗi vì mớ hỗn độn này!

Dưới đây là giảm dput:

 list(list(structure(list(name = "a", data = c("21016954")), .Names = c("name", "data" 
    )), structure(list(name = "b", data = c("17103795")), .Names = c("name", "data")), structure(list(name = "c", 
    data = c("38036543")), .Names = c("name", "data"))), list(structure(list(name = "c", data = c("42456597")), .Names = c("name","data")))) 
+0

Bạn có thể hiển thị kết quả mong muốn của mình không? –

+1

Hãy thử 'rapply (example.list, function (x) grep (" c ", x, value = TRUE))' – akrun

+1

Hmmm ... Tôi vừa viết một chức năng tuyệt vời để phù hợp với sản lượng mong muốn trước đó của bạn. Bummer ... –

Trả lời

2

chỉnh sửa thứ hai của bạn là dọc theo dòng đúng, nhưng bạn cần phải sử dụng Map thay vì lapply. Sử dụng dữ liệu của bạn

d <- list(list(structure(list(name = "a", data = c("21016954")), .Names = c("name", "data" 
    )), structure(list(name = "b", data = c("17103795")), .Names = c("name", "data")), structure(list(name = "c", 
    data = c("38036543")), .Names = c("name", "data"))), list(structure(list(name = "c", data = c("42456597")), .Names = c("name","data")))) 

Map(function(i, j) d[[i]][[j]], 
    i = which(lapply(lapply(d, function(x) grep("c",x)),length)>0), 
    j = unlist(lapply(d, function(x) grep("c",x)))) 

#[[1]] 
#[[1]]$name 
#[1] "c" 
# 
#[[1]]$data 
#[1] "38036543" 
# 
# 
#[[2]] 
#[[2]]$name 
#[1] "c" 
# 
#[[2]]$data 
#[1] "42456597" 
+0

vâng, có thực sự! Chức năng 'Bản đồ' tôi đã làm sau! Cảm ơn rất nhiều! – Maximilian

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