快速方法来展平列表列表,同时仅保留每个子列表中的第一个元素

时间:2012-10-09 17:22:34

标签: r

考虑创建列表列表的命令,如下所示:

myList <- list(a = list(1:5), b = "Z", c = NA)

这会产生类似:

的内容
 $a
 $a[[1]]
 [1] 1 2 3 4 5

 $b
 [1] "Z"

 $c
 [1] NA

现在当我取消这个时,

unlist(myList, recursive = FALSE)

我得到了

 $a
 [1] 1 2 3 4 5

 $b
 [1] "Z"

 $c
 [1] NA

而我实际上正在寻找的是每个子列表中的第一个元素,即

 1
 "Z"
 NA

循环很慢。请不要循环。

3 个答案:

答案 0 :(得分:6)

我想这取决于你认为是一个循环。例如我称这是一个循环,但也许你可以吗?

> sapply(unlist(myList, recursive=FALSE), "[", 1)
  a   b   c 
"1" "Z"  NA 

如果您不想要名字

> sapply(unlist(myList, recursive=FALSE, use.names=FALSE), "[", 1)
[1] "1" "Z" NA 

答案 1 :(得分:5)

@ GSee的解决方案可能是最常见的解决方案,但也有rapply()函数(“ recursive lapply() ”)来实现你的''寻找:

rapply(myList, function(x) x[1], how = "unlist")
#   a   b   c 
# "1" "Z"  NA 
unname(rapply(myList, function(x) x[1], how = "unlist"))
# [1] "1" "Z" NA

答案 2 :(得分:4)

试试这个:

 rapply(myList, function(x) head(x,1) )
  a   b   c 
"1" "Z"  NA