Как извлечь элементы из списка списков - программирование
Подтвердить что ты не робот

Как извлечь элементы из списка списков

Я новичок в 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"

Мне нужно получить уникальный список первых элементов в вектор i.e [ "a", "b" ] из этого вектора t1. Как я могу это сделать?

4b9b3361

Ответ 1

rapply предлагает еще один вариант:

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

Ответ 2

Другой способ - использовать 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"

Ответ 3

Я использовал бы do.call и rbind, чтобы объединить список в 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"

Ответ 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"   

Ответ 5

Использовать пакет rlist, т.е.

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