R 中数据帧的逐元素 rbind 列表
Element-wise rbind lists of dataframes in R
我有一个包含 3 个列表的列表,每个列表都有相同数量的数据帧,准确地说是 32 个,我希望 rbind
它们按元素遍历列表。举一个更简单的例子,假设你有一个列表有 2 个列表,每个列表有 2 个数据框,像这样:
[[1]]
[[1]][[1]]
x y
1 a 11
2 b 12
3 c 13
[[1]][[2]]
x y
1 a 14
2 b 15
3 c 16
[[2]]
[[2]][[1]]
x y
1 a 17
2 b 18
3 c 19
[[2]][[2]]
x y
1 a 21
2 b 22
3 c 23
给出者:
A <- data.frame(c("a","b","c"), c(11,12,13))
colnames(A)<-c("x","y")
B <- data.frame(c("a","b","c"), c(14,15,16))
colnames(B)<-c("x","y")
C <- data.frame(c("a","b","c"), c(17,18,19))
colnames(C)<-c("x","y")
D <- data.frame(c("a","b","c"), c(21,21,23))
colnames(D)<-c("x","y")
L1 <- list(A,B)
L2 <- list(C,D)
L <- list(L1,L2)
我如何 rbind
跨 2 个列表的数据框元素,这样最终的 output
是:
[[1]]
x y
1 a 11
2 b 12
3 c 13
4 a 17
5 b 18
6 c 19
[[2]]
x y
1 a 14
2 b 15
3 c 16
4 a 21
5 b 21
6 c 23
在这个例子中,我可以 output <- list(rbind(A,C),rbind(B,D))
但我想为更大的数据帧列表列表做这件事
这个怎么样:
A <- data.frame(c("a","b","c"), c(11,12,13))
colnames(A)<-c("x","y")
B <- data.frame(c("a","b","c"), c(14,15,16))
colnames(B)<-c("x","y")
C <- data.frame(c("a","b","c"), c(17,18,19))
colnames(C)<-c("x","y")
D <- data.frame(c("a","b","c"), c(21,21,23))
colnames(D)<-c("x","y")
L1 <- list(A,B)
L2 <- list(C,D)
L <- list(L1,L2)
lapply(1:2, \(i)rbind(L1[[i]], L2[[i]]))
#> [[1]]
#> x y
#> 1 a 11
#> 2 b 12
#> 3 c 13
#> 4 a 17
#> 5 b 18
#> 6 c 19
#>
#> [[2]]
#> x y
#> 1 a 14
#> 2 b 15
#> 3 c 16
#> 4 a 21
#> 5 b 21
#> 6 c 23
由 reprex package (v2.0.1)
于 2022-05-26 创建
可以只使用 purrr
中的 transpose
:
output <- lapply(purrr::transpose(L),
function(l) do.call(rbind, args = l))
output
您可以这样使用 map2
:
library(purrr)
map2(L1,L2,rbind)
输出:
[[1]]
x y
1 a 11
2 b 12
3 c 13
4 a 17
5 b 18
6 c 19
[[2]]
x y
1 a 14
2 b 15
3 c 16
4 a 21
5 b 21
6 c 23
基数 R:
Map(rbind, L1, L2)
[[1]]
x y
1 a 11
2 b 12
3 c 13
4 a 17
5 b 18
6 c 19
[[2]]
x y
1 a 14
2 b 15
3 c 16
4 a 21
5 b 21
6 c 23
我有一个包含 3 个列表的列表,每个列表都有相同数量的数据帧,准确地说是 32 个,我希望 rbind
它们按元素遍历列表。举一个更简单的例子,假设你有一个列表有 2 个列表,每个列表有 2 个数据框,像这样:
[[1]]
[[1]][[1]]
x y
1 a 11
2 b 12
3 c 13
[[1]][[2]]
x y
1 a 14
2 b 15
3 c 16
[[2]]
[[2]][[1]]
x y
1 a 17
2 b 18
3 c 19
[[2]][[2]]
x y
1 a 21
2 b 22
3 c 23
给出者:
A <- data.frame(c("a","b","c"), c(11,12,13))
colnames(A)<-c("x","y")
B <- data.frame(c("a","b","c"), c(14,15,16))
colnames(B)<-c("x","y")
C <- data.frame(c("a","b","c"), c(17,18,19))
colnames(C)<-c("x","y")
D <- data.frame(c("a","b","c"), c(21,21,23))
colnames(D)<-c("x","y")
L1 <- list(A,B)
L2 <- list(C,D)
L <- list(L1,L2)
我如何 rbind
跨 2 个列表的数据框元素,这样最终的 output
是:
[[1]]
x y
1 a 11
2 b 12
3 c 13
4 a 17
5 b 18
6 c 19
[[2]]
x y
1 a 14
2 b 15
3 c 16
4 a 21
5 b 21
6 c 23
在这个例子中,我可以 output <- list(rbind(A,C),rbind(B,D))
但我想为更大的数据帧列表列表做这件事
这个怎么样:
A <- data.frame(c("a","b","c"), c(11,12,13))
colnames(A)<-c("x","y")
B <- data.frame(c("a","b","c"), c(14,15,16))
colnames(B)<-c("x","y")
C <- data.frame(c("a","b","c"), c(17,18,19))
colnames(C)<-c("x","y")
D <- data.frame(c("a","b","c"), c(21,21,23))
colnames(D)<-c("x","y")
L1 <- list(A,B)
L2 <- list(C,D)
L <- list(L1,L2)
lapply(1:2, \(i)rbind(L1[[i]], L2[[i]]))
#> [[1]]
#> x y
#> 1 a 11
#> 2 b 12
#> 3 c 13
#> 4 a 17
#> 5 b 18
#> 6 c 19
#>
#> [[2]]
#> x y
#> 1 a 14
#> 2 b 15
#> 3 c 16
#> 4 a 21
#> 5 b 21
#> 6 c 23
由 reprex package (v2.0.1)
于 2022-05-26 创建可以只使用 purrr
中的 transpose
:
output <- lapply(purrr::transpose(L),
function(l) do.call(rbind, args = l))
output
您可以这样使用 map2
:
library(purrr)
map2(L1,L2,rbind)
输出:
[[1]]
x y
1 a 11
2 b 12
3 c 13
4 a 17
5 b 18
6 c 19
[[2]]
x y
1 a 14
2 b 15
3 c 16
4 a 21
5 b 21
6 c 23
基数 R:
Map(rbind, L1, L2)
[[1]]
x y
1 a 11
2 b 12
3 c 13
4 a 17
5 b 18
6 c 19
[[2]]
x y
1 a 14
2 b 15
3 c 16
4 a 21
5 b 21
6 c 23