我是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”]。我怎样才能做到这一点?
答案 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.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"
答案 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()