【发布时间】:2021-07-29 07:17:11
【问题描述】:
我有以下列表,list1 和 list2:
library(tidyverse)
df1a <- data.frame(
index = c(1, 1, 2, 2),
first_column = c(1, 2, 3, 4),
second_column = c(5, 6, 7, 8)
)
df1b <- data.frame(
index = c(1, 1, 2, 2),
first_column = c(4, 2, 3, 1),
second_column = c(8, 6, 7, 5)
)
list1 <- dplyr::lst(df1a, df1b)
df2a <- data.frame(
index = c(1, 1, 2, 2),
first_column = c(4, 3, 2, 1),
second_column = c(8, 7, 6, 5)
)
df2b <- data.frame(
index = c(1, 1, 2, 2),
first_column = c(8, 2, 6, 5),
second_column = c(4, 3, 7, 1)
)
list2 <- dplyr::lst(df2a, df2b)
这是我要在list1 和list2 上运行的函数:
output_mean <- function(subset, name) {
subset %>%
group_by(index) %>%
summarize(across(c(first_column, second_column), ~ mean(.x, na.rm = TRUE))) %>%
mutate(type = name) %>%
print()
}
现在,我可以遍历一个列表了:
x <- list()
for (i in names(list1)) {
ps <- output_mean(list1[[i]], i)
x[[paste0(i)]] <- ps
}
#> # A tibble: 2 x 4
#> index first_column second_column type
#> <dbl> <dbl> <dbl> <chr>
#> 1 1 1.5 5.5 df1a
#> 2 2 3.5 7.5 df1a
#> # A tibble: 2 x 4
#> index first_column second_column type
#> <dbl> <dbl> <dbl> <chr>
#> 1 1 3 7 df1b
#> 2 2 2 6 df1b
然后我可以将结果放入一个数据框中:
all1 <- do.call(rbind, x)
all1
#> # A tibble: 4 x 4
#> index first_column second_column type
#> * <dbl> <dbl> <dbl> <chr>
#> 1 1 1.5 5.5 df1a
#> 2 2 3.5 7.5 df1a
#> 3 1 3 7 df1b
#> 4 2 2 6 df1b
但是如果我想将list1 和list2 放入big_list 并循环遍历呢?
这是我尝试过的:
big_list <- list(list1, list2)
y <- list()
for (j in big_list){
x <- list()
for (i in names(j)) {
ps <- output_mean(j[[i]], i)
x[[paste0(i)]] <- ps
}
all = do.call(rbind, x)
}
循环有效,但在all 中只附加了两个数据帧,这是可以理解的,因为外部循环覆盖了all。
all
#> # A tibble: 4 x 4
#> index first_column second_column type
#> * <dbl> <dbl> <dbl> <chr>
#> 1 1 3.5 7.5 df2a
#> 2 2 1.5 5.5 df2a
#> 3 1 5 3.5 df2b
#> 4 2 5.5 4 df2b
我尝试了许多不同的方法,但我无法将四个数据帧附加到一个 4 x 8 数据帧中。
由reprex package (v2.0.0) 于 2021-05-06 创建
【问题讨论】: