添加具有每个元素名称作为值的新列

时间:2018-09-23 11:28:46

标签: r list purrr

我在列表中有一堆数据框。我正在尝试使用数据框的“名称”作为值向每个数据框添加新列。

我的示例数据:

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()

3 个答案:

答案 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)

我将使用map2mutate来做到这一点:

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))