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

Vin*_*wal 3 r

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

myList <- list(a = list(1:5), b = "Z", c = NA)
Run Code Online (Sandbox Code Playgroud)

这创造了类似的东西:

 $a
 $a[[1]]
 [1] 1 2 3 4 5

 $b
 [1] "Z"

 $c
 [1] NA
Run Code Online (Sandbox Code Playgroud)

现在,当我取消这个时,

unlist(myList, recursive = FALSE)
Run Code Online (Sandbox Code Playgroud)

我明白了

 $a
 [1] 1 2 3 4 5

 $b
 [1] "Z"

 $c
 [1] NA
Run Code Online (Sandbox Code Playgroud)

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

 1
 "Z"
 NA
Run Code Online (Sandbox Code Playgroud)

循环非常慢.请不要循环.

GSe*_*See 6

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

> sapply(unlist(myList, recursive=FALSE), "[", 1)
  a   b   c 
"1" "Z"  NA 
Run Code Online (Sandbox Code Playgroud)

如果你不想要这些名字

> sapply(unlist(myList, recursive=FALSE, use.names=FALSE), "[", 1)
[1] "1" "Z" NA 
Run Code Online (Sandbox Code Playgroud)

  • 你永远无法避免循环.它总是被埋在某处.你永远无法避免循环.总是如此... (2认同)
  • @VinayakAgarwal,我更新了显示`use.names`参数的用法.更一般地说,您可以在`unname()`中包装命名对象以删除名称. (2认同)

A5C*_*2T1 5

@ GSee的解决方案可能是最常见的解决方案,但也有一个rapply()功能(" 递归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
Run Code Online (Sandbox Code Playgroud)