2015-05-26 120 views
5

我已經搜索過但無法找到相關答案。搜索和列表的子集列表

的樣本數據:

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

我想子集包含字母 「C」 的文章:

下面這得到包含字母 「c」 的最後一個索引節點:

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

我如何獲得上述索引的列表?或者如何以其他方式獲取列表?

獲取列表C(1,3)有一前述列表中的節點C(1,2)的最後節點的一部分。

編輯:所需的輸出:(像這樣)

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


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

但是我需要的是也與提供索引明白,我怎麼能得到嵌套列表的子集?請使用check.a

編輯2:

因此,這裏有可能被用來子集相關列表中的節點列表索引:

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

的想法是這樣的:(不工作,只是爲了證明我」米之後)

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

EDIT 3:(LAST EDIT)

的實際數據廁所像這樣的KS:(我希望我與提供的索引解決方案,這就是爲什麼我減少了對這個問題)

[[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 

對不起,這個爛攤子!

這裏降低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

你能顯示你想要的輸出嗎? –

+1

嘗試'rapply(example.list,函數(X)的grep( 「C」,X值= TRUE))' – akrun

+1

嗯...我只是寫了一個很酷的功能,以符合之前所需的輸出。長號... –

回答

2

你的第二個修改是沿着正確的線路,但你需要使用Map而不是lapply。使用你的數據

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

是的,的確如此!函數'Map'我之後!非常感謝! – Maximilian