如何使用基数 R 绑定列表的每个第 n 个元素?
How to rbind every nth element of a list using base R?
我有一个包含不同数据帧的列表。列表中的每个第 n 个数据帧都具有相同的结构。列表有点像这样:
my_list <- list(list(data.frame(a= rnorm(10), b= rnorm(10)),
data.frame(abc= letters[1:10])),
list(data.frame(a= rnorm(10), b= rnorm(10)),
data.frame(abc= letters[11:20])))
我想rbind.data.frame
每个列表的第一个数据框和每个列表的第二个数据框。因此,我的预期结果是:
list(rbind.data.frame(my_list[[1]][[1]], my_list[[2]][[1]]),
rbind.data.frame(my_list[[1]][[2]], my_list[[2]][[2]]))
在这个例子中,每个列表有两个数据帧,但在我的例子中,数据帧的数量可以改变,而 运行 代码又一次。所以我需要一个绑定每个第 n 个列表的通用解决方案。我怎样才能用 base R 做到这一点?必须是基数R.
我们可以使用 purrr
中的 transpose
然后将它们与 bind_rows
绑定
library(dplyr)
library(purrr)
my_list %>%
transpose %>%
map(bind_rows)
-输出
[[1]]
a b
1 -0.40658840 1.09857513
2 -2.32161471 -0.56369035
3 0.69620650 0.06641017
4 0.36916329 0.89903129
5 1.48593464 -0.01071652
6 -0.42947609 0.73611717
7 0.30131109 1.30576324
8 0.23362408 0.09240332
9 -0.06293769 0.20475366
10 -0.33819360 -0.92148073
11 0.86595847 0.97195603
12 0.07233009 0.18503846
13 -0.36391964 -0.34366129
14 -1.47300138 1.02652189
15 0.51676676 0.57571450
16 0.24114748 0.26843610
17 -0.86102844 -1.08844244
18 -1.08346107 2.30818241
19 -1.22420213 -1.06698399
20 -0.55371072 0.67798167
[[2]]
abc
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
11 k
12 l
13 m
14 n
15 o
16 p
17 q
18 r
19 s
20 t
或使用base R
lapply(split(do.call(c, my_list), rep(c(TRUE, FALSE),
length(my_list))), \(x) do.call(rbind, x))
-输出
$`FALSE`
abc
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
11 k
12 l
13 m
14 n
15 o
16 p
17 q
18 r
19 s
20 t
$`TRUE`
a b
1 -0.40658840 1.09857513
2 -2.32161471 -0.56369035
3 0.69620650 0.06641017
4 0.36916329 0.89903129
5 1.48593464 -0.01071652
6 -0.42947609 0.73611717
7 0.30131109 1.30576324
8 0.23362408 0.09240332
9 -0.06293769 0.20475366
10 -0.33819360 -0.92148073
11 0.86595847 0.97195603
12 0.07233009 0.18503846
13 -0.36391964 -0.34366129
14 -1.47300138 1.02652189
15 0.51676676 0.57571450
16 0.24114748 0.26843610
17 -0.86102844 -1.08844244
18 -1.08346107 2.30818241
19 -1.22420213 -1.06698399
20 -0.55371072 0.67798167
Select 您感兴趣的元素,例如
lapply(my_list, `[[`, 1)
第一个data.frame。然后使用do.call()
到rbind
列表中选择data.frames
do.call(rbind, lapply(my_list, `[[`, 1))
使用提取任何列表元素的函数对此进行概括i
FUN <- function(x, i)
do.call(rbind, lapply(x, `[[`, i))
并使用 lapply()
生成您感兴趣的多个 data.frame
lapply(1:2, FUN, x = my_list)
我有一个包含不同数据帧的列表。列表中的每个第 n 个数据帧都具有相同的结构。列表有点像这样:
my_list <- list(list(data.frame(a= rnorm(10), b= rnorm(10)),
data.frame(abc= letters[1:10])),
list(data.frame(a= rnorm(10), b= rnorm(10)),
data.frame(abc= letters[11:20])))
我想rbind.data.frame
每个列表的第一个数据框和每个列表的第二个数据框。因此,我的预期结果是:
list(rbind.data.frame(my_list[[1]][[1]], my_list[[2]][[1]]),
rbind.data.frame(my_list[[1]][[2]], my_list[[2]][[2]]))
在这个例子中,每个列表有两个数据帧,但在我的例子中,数据帧的数量可以改变,而 运行 代码又一次。所以我需要一个绑定每个第 n 个列表的通用解决方案。我怎样才能用 base R 做到这一点?必须是基数R.
我们可以使用 purrr
中的 transpose
然后将它们与 bind_rows
library(dplyr)
library(purrr)
my_list %>%
transpose %>%
map(bind_rows)
-输出
[[1]]
a b
1 -0.40658840 1.09857513
2 -2.32161471 -0.56369035
3 0.69620650 0.06641017
4 0.36916329 0.89903129
5 1.48593464 -0.01071652
6 -0.42947609 0.73611717
7 0.30131109 1.30576324
8 0.23362408 0.09240332
9 -0.06293769 0.20475366
10 -0.33819360 -0.92148073
11 0.86595847 0.97195603
12 0.07233009 0.18503846
13 -0.36391964 -0.34366129
14 -1.47300138 1.02652189
15 0.51676676 0.57571450
16 0.24114748 0.26843610
17 -0.86102844 -1.08844244
18 -1.08346107 2.30818241
19 -1.22420213 -1.06698399
20 -0.55371072 0.67798167
[[2]]
abc
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
11 k
12 l
13 m
14 n
15 o
16 p
17 q
18 r
19 s
20 t
或使用base R
lapply(split(do.call(c, my_list), rep(c(TRUE, FALSE),
length(my_list))), \(x) do.call(rbind, x))
-输出
$`FALSE`
abc
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
11 k
12 l
13 m
14 n
15 o
16 p
17 q
18 r
19 s
20 t
$`TRUE`
a b
1 -0.40658840 1.09857513
2 -2.32161471 -0.56369035
3 0.69620650 0.06641017
4 0.36916329 0.89903129
5 1.48593464 -0.01071652
6 -0.42947609 0.73611717
7 0.30131109 1.30576324
8 0.23362408 0.09240332
9 -0.06293769 0.20475366
10 -0.33819360 -0.92148073
11 0.86595847 0.97195603
12 0.07233009 0.18503846
13 -0.36391964 -0.34366129
14 -1.47300138 1.02652189
15 0.51676676 0.57571450
16 0.24114748 0.26843610
17 -0.86102844 -1.08844244
18 -1.08346107 2.30818241
19 -1.22420213 -1.06698399
20 -0.55371072 0.67798167
Select 您感兴趣的元素,例如
lapply(my_list, `[[`, 1)
第一个data.frame。然后使用do.call()
到rbind
列表中选择data.frames
do.call(rbind, lapply(my_list, `[[`, 1))
使用提取任何列表元素的函数对此进行概括i
FUN <- function(x, i)
do.call(rbind, lapply(x, `[[`, i))
并使用 lapply()
生成您感兴趣的多个 data.frame
lapply(1:2, FUN, x = my_list)