Ответ 1
rapply
предлагает еще один вариант:
unique(rapply(t1, function(x) head(x, 1)))
Я новичок в 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
. Как я могу это сделать?
rapply
предлагает еще один вариант:
unique(rapply(t1, function(x) head(x, 1)))
Другой способ - использовать 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"
Я использовал бы 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"
Я попытался рассмотреть общий случай, когда один или несколько подписок содержат более одного элемента.
Например:
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"
Использовать пакет rlist
, т.е.
library(rlist)
yourlist %>>% list.map(.[1])