从R中的列表中提取矢量

时间:2018-04-11 14:46:51

标签: r list sapply

我一直尝试这样做但是无法达成解决方案......

我有一个清单,比如说:

> 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)

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

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

3 个答案:

答案 0 :(得分:3)

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

sapply(a, `[`, 3)

以下是一个例子:

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

答案 1 :(得分:1)

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

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

虽然在评论中你说由于某种原因你希望填充符合0而不是NA

答案 2 :(得分:0)

如果您需要除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 

你也可以尝试一个整合的解决方案

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