如何从列表列表中提取元素

时间:2013-01-17 10:03:46

标签: r vector

我是R的新手。我在R中有一个列表t1,看起来像

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


[[2]]
[[2]][[1]]
[1] "a"        "disease1"


[[3]]
[[3]][[1]]
[1] "a"        "disease2"


[[4]]
[[4]][[1]]
[1] "b"       "control"


[[5]]
[[5]][[1]]
[1] "b"        "disease1"


[[6]]
[[6]][[1]]
[1] "b"        "disease2"

我需要从这个向量t1中得到一个唯一的第一个元素列表到一个向量中,即[“a”,“b”]。我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:17)

rapply提供了另一种选择:

unique(rapply(t1, function(x) head(x, 1)))

答案 1 :(得分:16)

另一种方法是使用unlist

> t1=list(list(c("a","control")),list(c("b","disease1")))
> t1
[[1]]
[[1]][[1]]
[1] "a"       "control"


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

> matrix(unlist(t1),ncol=2,byrow=TRUE)
     [,1] [,2]      
[1,] "a"  "control" 
[2,] "b"  "disease1"

答案 2 :(得分:13)

我会使用do.callrbind将列表连接到data.frame。然后,您可以在第一列上使用unique来获取唯一项目(使用@ A.R给出的示例):

spam = do.call("rbind", lapply(t1, "[[", 1))
> spam
     [,1] [,2]      
[1,] "a"  "control"                                                         
[2,] "b"  "disease1" 
> unique(spam[,1])
[1] "a" "b"

答案 3 :(得分:4)

当一个或多个子列表包含多个元素时,我试图处理一般情况。

例如:

ll <- 
        list(list(c("a","control")),
             list(c("b","disease1")),
             list(c("c","disease2"),c("c","disease2bis")), # 2 elements
             list(c("d","disease3")),
             list(c("e","disease4"))
)

您可以这样做:

 unlist(lapply(ll,                                 ## for each element in the big list
        function(x) 
             sapply(1:length(x),                   ## for each element in the sublist
             function(y)do.call("[[",list(x,y))))) ## retrieve x[[y]]


[1] "a"           "control"     "b"           "disease1"    "c"         
     "disease2"    "c"           "disease2bis" "d"           "disease3"   
[11] "e"           "disease4"   

答案 4 :(得分:2)

使用包rlist,即

library(rlist)
yourlist %>>% list.map(.[1])

答案 5 :(得分:1)

作为2020年的更新,使用purrr可以轻松直观地完成此操作。使用@ Gago-Silva的测试列表:

library(purrr)
t1 %>% flatten() %>% map(1) %>% as_vector()

将子列表展平为字符向量,从中提取元素1,并将此一元素字符向量列表转换为一个向量。

还请注意,您可以使用

直接从列表列表中获得提示。
t1 %>% flatten_dfc()