从R中的列表中提取向量

Extract vector from list in R

我已经尝试这样做了一段时间,但无法找到解决方案...

我有一个列表,说一个:

> a
[[1]]
[1] 10 30

[[2]]
[1] 15 20

[[3]]
[1] 12 15 30

$[[4]]
[1] 15 30 20

我想将第一个元素、第二个和第三个元素提取到向量中。

我知道如何提取第一个和第二个元素:

first <- sapply(a, "[[", 1)
second <- sapply(a, "[[", 2)

但是当我试图提取第三个时,我得到了一个错误,因为列表中的一些向量中没有第三个元素。

我该怎么做?我应该向列表中只有两个值的向量添加一个零吗?

由于您要对原子向量进行子集化,因此您应该使用 [。然后,当您选择缺少的元素时,结果将自动为 NA。所以答案是:

sapply(a, `[`, 3)

这是一个例子:

a <- list(1:2, 3:4, 5:7, 8:10)
sapply(a, `[`, 3)
# [1] NA NA  7 10

当您想要 NA 以外的其他值时,您可以试试这个。否则使用的答案 @docendo discimus

sapply(list(a=1:2,b=1:3), function(x,y){
       if(length(x) < y) 0 else x[y]},3)
a b 
0 3 

您也可以尝试 tidyverse 解决方案

library(tidyverse)
map_int(list(a=1:2,b=1:3), function(x) coalesce(x[3],0L))
a b 
0 3 

另一种方法是用NA填充列表,转置列表,并取消列出结果的元素

lapply(transpose(lapply(a, `length<-`, max(lengths(a)))), unlist)

尽管在评论中您说出于某种原因您希望填充 0 而不是 NA