Добавить новый столбец с именем каждого элемента в качестве значения - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть куча фреймов данных в списке.Я пытаюсь добавить новый столбец к каждому фрейму данных, указав в качестве значения имя фрейма.

Данные моего примера:

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 map() функций, поэтому, если вы можете показать ответ с мурлыканием, дополнительные очки!

Я думаю о следующем, но это не работает:

map(list,
    add_column,
    ~ year = names(.x))

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Я бы использовал 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
0 голосов
/ 23 сентября 2018

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))
0 голосов
/ 23 сентября 2018

Tidyverse решение: -)

Мы берем список и названия списка, используем map2 из purrr и add_column из tibble, чтобы собрать все вместе.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...