Восстановить список имен после применения мурлыкания - PullRequest
0 голосов
/ 29 декабря 2018

Есть ли способ не потерять атрибуты имени списка после использования purrr::reduce?

Пример

У меня есть список:

library(tidyverse)
l <- list(A = data_frame(ID = c(101, 102, 103),
                         x = c(1,2,3)),
          B = data_frame(ID = c(101, 102, 103),
                         x = c(4,5,6)),
          C = data_frame(ID = c(101, 102, 103),
                         x = c(7,8,9)))

Я могу присоединиться к спискам по «ID», используя reduce, а затем использовать setNames для именования столбцов, подобных этому.

l %>% 
  purrr::reduce(left_join, by = "ID") %>% 
  setNames(c("ID", names(l)))

Но я бы хотел взять этот список и напрямую направить его в purrr::reduce а затем переименуйте столбцы «A», «B» и «C», не создавая объект l, но когда я это сделаю, имена списков больше не будут доступны.

Вопрос

Что я могу сделать с кодом ниже, чтобы изменить имена столбца «x» без необходимости создавать список l или указывать имена отдельных столбцов?

list(A = data_frame(ID = c(101, 102, 103),
                    x = c(1,2,3)),
     B = data_frame(ID = c(101, 102, 103),
                    x = c(4,5,6)),
     C = data_frame(ID = c(101, 102, 103),
                    x = c(7,8,9))) %>% 
  purrr::reduce(left_join, by = "ID")

1 Ответ

0 голосов
/ 29 декабря 2018

Вы можете использовать imap и set_names из purrr, чтобы переименовать столбцы перед объединением

library(purrr)
list(A = data_frame(ID = c(101, 102, 103),
                    x = c(1,2,3)),
     B = data_frame(ID = c(101, 102, 103),
                    x = c(4,5,6)),
     C = data_frame(ID = c(101, 102, 103),
                    x = c(7,8,9))) %>% 
  imap(.x = ., ~ set_names(.x, c("ID", .y))) %>% 
  reduce(dplyr::left_join, by = "ID")
# A tibble: 3 x 4
#     ID     A     B     C
#  <dbl> <dbl> <dbl> <dbl>
#1   101     1     4     7
#2   102     2     5     8
#3   103     3     6     9
...