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

rlp*_*rao 19 r vector

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

[[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"
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*rde 17

rapply 提供另一种选择:

unique(rapply(t1, function(x) head(x, 1)))
Run Code Online (Sandbox Code Playgroud)


Gag*_*lva 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"
Run Code Online (Sandbox Code Playgroud)


Pau*_*tra 13

我会使用do.call并将rbind列表连接成一个data.frame.然后,您可以unique在第一列上使用以获取唯一项(使用@AR给出的示例):

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


ags*_*udy 5

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

例如:

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"))
)
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

 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"   
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 5

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

library(purrr)
t1 %>% flatten() %>% map(1) %>% as_vector()
Run Code Online (Sandbox Code Playgroud)

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

另请注意,您可以直接从列表列表中获取小标题

t1 %>% flatten_dfc()
Run Code Online (Sandbox Code Playgroud)