应用 purrr reduce r 后恢复列表名称

Recover list names after applying purrr reduce r

有没有办法避免在使用 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)))

我可以使用 reduce 加入“ID”列表,然后使用 setNames 像这样命名列。

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

但我想将此列表直接通过管道传输到 purrr::reduce,然后在不创建对象 l 的情况下重命名列“A”、“B”和“C”,但是当我这样做列表名称不再可用。

问题

我可以对下面的代码做些什么来更改列“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")

您可以在合并前使用 purrr 中的 imapset_names 重命名列

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