从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
。
我已经尝试这样做了一段时间,但无法找到解决方案...
我有一个列表,说一个:
> 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
。