在子列表中选择元素并使其成为数据框中的一列

Pick element in sublist and make it a column in a data frame

我有一个包含 2000 个子列表的列表,每个子列表包含 7 个相同形式的元素。这些元素中的第五个是具有 40 个元素的数值向量。我的目标是获得一个包含 2000 行和 40 列的数据框,其中每列代表 2000 个子列表的第五个元素中的 40 个元素之一。这是一个缩小的例子:

sub_list_1 <- list(a = c(1:5), b = "b")
sub_list_2 <- list(a = c(6:10), b = "b")
sub_list_3 <- list(a = c(11:15), b = "b")
top_list <- list(sub_list_1, sub_list_2, sub_list_3)

现在,假设我想要一个包含 5 列和三行的数据框,其中每一列代表 a 中的五个元素之一,每一行代表一个子列表。因此,输出应该是

 output
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15

一种基本的R方法是使用sapply提取值,其中returns一个矩阵,当每个列表提取的元素具有相同的长度时,转置t的结果。

 t(sapply(top_list, "[[", 1))
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15

您还可以使用 as.data.frame 将矩阵转换为 data.frame。

as.data.frame(t(sapply(top_list, "[[", 1)))
  V1 V2 V3 V4 V5
1  1  2  3  4  5
2  6  7  8  9 10
3 11 12 13 14 15

另一种方式是这个。

do.call(rbind, sapply(top_list, `[`, 1))

首先,sapply 提取每个列表的第一个向量,然后 do.call rbinds 将这些向量放入 matrix.

另一种不使用循环更有效的方法是取消列出列表并创建矩阵:

vals <- unlist(top_list)
matrix(as.numeric(vals[vals!='b']),ncol=length(top_list[[1]]$a),byrow = TRUE)

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15