应用 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
中的 imap
和 set_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
有没有办法避免在使用 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
中的 imap
和 set_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