我在列表中有一堆数据框。我正在尝试使用数据框的“名称”作为值向每个数据框添加新列。
我的示例数据:
library(tidyverse)
df_2018 <- data_frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
df_2017 <- data_frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
list <- list(df_2017 = df_2017, df_2018 = df_2018)
导致:
> list
$df_2017
# A tibble: 3 x 2
y1 y2
<dbl> <dbl>
1 3 6
2 2 5
3 1 4
$df_2018
# A tibble: 3 x 2
y1 y2
<dbl> <dbl>
1 1 4
2 2 5
3 3 6
所需结果:
> list
$df_2017
# A tibble: 3 x 3
y1 y2 year
<dbl> <dbl> <chr>
1 3 6 df_2017
2 2 5 df_2017
3 1 4 df_2017
$df_2018
# A tibble: 3 x 3
y1 y2 year
<dbl> <dbl> <chr>
1 1 4 df_2018
2 2 5 df_2018
3 3 6 df_2018
我正在学习purrr
的{{1}}函数,因此,如果您可以使用purrr显示答案,则可以加分!
我在考虑以下内容,但这不起作用:
map()
答案 0 :(得分:1)
tidyverse解决方案:-)
我们获取列表和列表名称,使用purrr中的map2
和tibble中的add_column
将所有内容组合在一起。
map2(list, names(list), function(x, y) add_column(x, year = y))
$`df_2017`
# A tibble: 3 x 3
y1 y2 year
<dbl> <dbl> <chr>
1 3 6 df_2017
2 2 5 df_2017
3 1 4 df_2017
$df_2018
# A tibble: 3 x 3
y1 y2 year
<dbl> <dbl> <chr>
1 1 4 df_2018
2 2 5 df_2018
3 3 6 df_2018
答案 1 :(得分:1)
我将使用map2
和mutate
来做到这一点:
library(dplyr)
library(purrr)
mlist <- list(df_2017 = df_2017, df_2018 = df_2018)
map2(mlist, names(mlist), ~ mutate(.x, year = .y))
$df_2017
y1 y2 year
1 3 6 df_2017
2 2 5 df_2017
3 1 4 df_2017
$df_2018
y1 y2 year
1 1 4 df_2018
2 2 5 df_2018
3 3 6 df_2018
答案 2 :(得分:1)
base
解决方案,使用lapply
lst <- list(df_2017 = df_2017, df_2018 = df_2018) #I'm using lst as name instead of "list" as it is reserved in R
temp <- lapply(seq_along(lst), function(x) rep(names(lst[x]), times = nrow(lst[[x]])))
lapply(seq_along(lst), function(i) cbind(lst[[i]], year=temp[[i]]))
#returns
[[1]]
y1 y2 year
1 3 6 df_2017
2 2 5 df_2017
3 1 4 df_2017
[[2]]
y1 y2 year
1 1 4 df_2018
2 2 5 df_2018
3 3 6 df_2018
在@markus之后,这里是使用Map
Map("[<-", lst, "year", value = names(lst))