我是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)
当一个或多个子列表包含多个元素时,我尝试处理一般情况。
例如:
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)
作为 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)