我一直尝试这样做但是无法达成解决方案......
我有一个清单,比如说:
> 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)
但是当试图提取第三个时,我得到一个错误,因为列表中的某些向量中没有第三个元素。
我怎么能这样做?我应该在列表中只有两个值的向量中添加零吗?
答案 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