R 在子列表中选取元素并使其成为数据框中的列
我有一个2000个子列表的列表,每个子列表有7个元素,每个元素的形式相同。其中第五个元素是一个包含40个元素的数字向量。我的目标是获得一个包含2000行和40列的数据帧,其中每列表示2000个子列表第五个元素中40个元素中的一个。以下是一个缩小规模的示例:R 在子列表中选取元素并使其成为数据框中的列,r,list,sublist,R,List,Sublist,我有一个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)
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)
一种基本的R方法是使用
sapply
来提取值,当每个列表提取的元素具有相同的长度时,该方法返回一个矩阵,将结果转置为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
一种基本的R方法是使用
sapply
来提取值,当每个列表提取的元素具有相同的长度时,该方法返回一个矩阵,将结果转置为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。调用rbinds
这些向量到矩阵中
另一种方法是这种方法
do.call(rbind, sapply(top_list, `[`, 1))
首先,sapply
提取每个列表的第一个向量,然后do。调用rbinds
这些向量到矩阵中
另一种不使用循环更有效的方法是取消列表并创建矩阵:
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
vals另一种不使用循环更有效的方法是取消列表并创建矩阵:
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
vals