R 如何合并具有相同列名的数据帧列表?

R 如何合并具有相同列名的数据帧列表?,r,purrr,R,Purrr,我有以下数据帧 df1 <- tibble::as.tibble(list(a = c(1,2,3), d = c(10,11,12) ,id = c("a","b","c"))) df2 <- tibble::as.tibble(list(a = c(4,5,6), e = c(13,14,15) ,id = c("a","b","c"))) df3 <- tibble::as.tibble(list(a = c(7,8,9), f = c(16,17,18) ,id = c

我有以下数据帧

df1 <- tibble::as.tibble(list(a = c(1,2,3), d = c(10,11,12) ,id = c("a","b","c")))
df2 <- tibble::as.tibble(list(a = c(4,5,6), e = c(13,14,15) ,id = c("a","b","c")))
df3 <- tibble::as.tibble(list(a = c(7,8,9), f = c(16,17,18) ,id = c("a","b","c")))
下面是我试过的代码

test_list <- list(df1, df2, df3)
names(test_list) <- c("df1", "df2", "df3")
seq_along(temp) %>% 
      purrr::reduce(
      ~merge(
      temp[[.x]], 
      temp[[.y]], 
      suffix = c(names(test_list[.x]), names(test_list[.y])))
测试列表这看起来怎么样

t <- merge(df1,df2, by = "id" )
df <- merge(t,df3, by = "id" )
names(df) <- c("id", "a.df1", "a.df2", "a.df3")
t这看起来怎么样

t <- merge(df1,df2, by = "id" )
df <- merge(t,df3, by = "id" )
names(df) <- c("id", "a.df1", "a.df2", "a.df3")
t
library(tidyverse)
df1 1和值!=“id”)%%>%
拉动(值)->重叠
map2(测试列表,名称(测试列表),~{names(.x)[names(.x)%in%overlaps]=paste0(names(.x)[names(.x)%in%overlaps],“,.y);.x}]>%
减少(函数(x,y)左联合(x,y,by=“id”))%>%
选择(id,everything())
##tibble:3 x 7
#id a.df1 d a.df2 e a.df3 f
#         
#1A 110413716
#2B2111414817
#3 c 3 12 6 15 9 18
给定一个列表及其名称,我们使用
map2
更新位置1中每个元素的名称(即列
a

然后我们使用
reduce
按顺序连接数据帧,并使用
select
排列列。

库(tidyverse)
df1 1和值!=“id”)%%>%
拉动(值)->重叠
map2(测试列表,名称(测试列表),~{names(.x)[names(.x)%in%overlaps]=paste0(names(.x)[names(.x)%in%overlaps],“,.y);.x}]>%
减少(函数(x,y)左联合(x,y,by=“id”))%>%
选择(id,everything())
##tibble:3 x 7
#id a.df1 d a.df2 e a.df3 f
#         
#1A 110413716
#2B2111414817
#3 c 3 12 6 15 9 18
给定一个列表及其名称,我们使用
map2
更新位置1中每个元素的名称(即列
a


然后,我们使用
reduce
按顺序连接数据帧,并使用
select
排列列。

如果您提供 它将创建一个data.frames列表作为第二个输入,并将它们连接起来 递归地返回到第一个输入。我们可以重命名所有“a”列并使用它

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
dfs <- imap(lst(df1,df2,df3), ~rename_at(.x, "a",paste, .y, sep="."), .y) %>%
  unname()
eat(dfs[[1]], dfs[-1], .by = "id")
# # A tibble: 3 x 7
#   id    a.df1     d a.df2     e a.df3     f
#   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 a         1    10     4    13     7    16
# 2 b         2    11     5    14     8    17
# 3 c         3    12     6    15     9    18
#devtools::安装_github(“moodymudskipper/safejoin”)
图书馆(安全连接)
dfs%
名字()
eat(dfs[[1]],dfs[-1],.by=“id”)
##tibble:3 x 7
#id a.df1 d a.df2 e a.df3 f
#         
#1A 110413716
#2B2111414817
#3 c 3 12 6 15 9 18

如果您提供 它将创建一个data.frames列表作为第二个输入,并将它们连接起来 递归地返回到第一个输入。我们可以重命名所有“a”列并使用它

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
dfs <- imap(lst(df1,df2,df3), ~rename_at(.x, "a",paste, .y, sep="."), .y) %>%
  unname()
eat(dfs[[1]], dfs[-1], .by = "id")
# # A tibble: 3 x 7
#   id    a.df1     d a.df2     e a.df3     f
#   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 a         1    10     4    13     7    16
# 2 b         2    11     5    14     8    17
# 3 c         3    12     6    15     9    18
#devtools::安装_github(“moodymudskipper/safejoin”)
图书馆(安全连接)
dfs%
名字()
eat(dfs[[1]],dfs[-1],.by=“id”)
##tibble:3 x 7
#id a.df1 d a.df2 e a.df3 f
#         
#1A 110413716
#2B2111414817
#3 c 3 12 6 15 9 18

谢谢您的回答。是的,我有更多的专栏,这只是一个展示重叠专栏的代表性例子。很遗憾,我无法硬编码这些名字。谢谢你的回答。是的,我有更多的专栏,这只是一个展示重叠专栏的代表性例子。我将无法硬编码的名称很遗憾。谢谢你的答复。但问题是,我有更多的列,这些列在数据帧之间并不常见,理想情况下,我不想在所有列中添加后缀,即df*,而只在重叠列中添加后缀。谢谢您的回复。但问题是,我有更多的列,这些列在数据帧之间并不常见,理想情况下,我不想在所有列中添加后缀,即df*,而只对重叠列添加后缀。