如何获取一个列表中每个向量的第n个元素,而这些向量的长度是未知的。

15
如果我们有一个列表,每个项目的长度可能不同。例如:
l <- list(c(1, 2), c(3, 4,5), c(5), c(6,7))

为了表述更清晰,我们将列表中的对象称为“项目”,列表中的对象称为“元素”。

我们如何提取每个项目的第一个元素?在这里,我想提取:

1, 3, 5, 6

然后同样的问题针对每个项目的第二个元素:

2, 4, NA, 7

如果l是一个列表的列表,那么这些将被称为子列表;但无论如何,它是一个向量列表(不确定是否使用术语“子向量”,但您明白我的意思)。当您说“例如我们如何提取每个项目的第一个元素?...然后第二个...?”时,您的问题真的是“如何迭代/展平/解包向量列表,广度优先?”即,您想保留结构并对其进行索引吗?还是只是将其转换为平面向量/列表?在任何情况下,每个都应该有重复。 - smci
3个回答

22

我们可以使用sapply创建一个函数。

fun1 <- function(lst, n){
         sapply(lst, `[`, n)
   }
fun1(l, 1)
#[1] 1 3 5 6

fun1(l, 2)
#[1]  2  4 NA  7

这里的 [ 是什么意思?我在哪里可以学习更多关于 sapply 的用法?谢谢。 - John Smith
2
@XRSC 这是一个?Extract操作符,可以从数据框/矩阵的行/列或向量的元素中提取出来。您可以从?Extract中获取更多详细信息。 - akrun

4

data.table::transpose(l) 将会给你一个列表,其中包含所有第一个元素的向量,所有第二个元素的向量等等。

l <- list(1:2, 3:4, 5:7, 8:10)
b <- data.table::transpose(l)
b
# [[1]]
# [1] 1 3 5 8
# 
# [[2]]
# [1] 2 4 6 9
# 
# [[3]]
# [1] NA NA  7 10

如果你不想要NA值,可以使用lapply(b, function(x) x[!is.na(x)])。这个函数可以帮助你去除含有NA值的元素。

0
# the source list 
source_list <- list(c(1, 2), c(3, 4,5), c(5), c(6,7))

# the index of the elements you want 
k <- 1

# the results character vector 
x <- c()

for (item in source_list) {
     x <- append(x, item[k])
   }

print(x)
[1] 1 3 5 6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接