在子列表中选择元素并使其成为数据框中的一列
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
我有一个包含 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