合并为R中数据框的合并

ulr*_*ich 1 merge r

基于以下数据框:

df1<-data.frame(ast = c('MMM', 'ABT','AES'), aloc = c(0.4140585, 0.3599352,0.2260063))
df2<-data.frame(ast = c('MMM','ABT','AFL', 'AES','A'), aloc =c(0.2493530, 0.2478328, 0.1720778, 0.1702486, 0.1604878))
df3<-data.frame(ast = c('ABT','MMM','ADBE','AFL','AMD' ), aloc =c(0.2578605, 0.2540922, 0.2183000, 0.1364096, 0.1333377 ))
Run Code Online (Sandbox Code Playgroud)

我想做一些类似merge(虽然我不能用merge),以获得以下结果:

#       Df1       Df2       Df3 
A        NA        NA    0.1604878
ABT  0.3599352 0.2478328 0.2578605
ADBE     NA        NA    0.2183000
AES  0.2260063 0.1702486      NA
AFL     NA     0.1720778 0.1364096
AMD     NA         NA    0.1333377
MMM  0.4140585 0.2493530 0.2540922
Run Code Online (Sandbox Code Playgroud)

Ste*_*pré 5

你可以使用dplyr:

library(dplyr)

full_join(df1, df2, by = "ast") %>% 
  full_join(., df3, by = "ast") %>%
  setNames(c(names(.)[1], paste0("df", 1:3))) %>%
  arrange(ast)
Run Code Online (Sandbox Code Playgroud)

这使:

#   ast       df1       df2       df3
#1    A        NA 0.1604878        NA
#2  ABT 0.3599352 0.2478328 0.2578605
#3 ADBE        NA        NA 0.2183000
#4  AES 0.2260063 0.1702486        NA
#5  AFL        NA 0.1720778 0.1364096
#6  AMD        NA        NA 0.1333377
#7  MMM 0.4140585 0.2493530 0.2540922
Run Code Online (Sandbox Code Playgroud)

或者@RichardScriven提到的:

Reduce(function(...) full_join(..., by = "ast"), list(df1, df2, df3)) %>% arrange(ast)
Run Code Online (Sandbox Code Playgroud)

如果您df的全球环境中有很多以df n的形式存在,那么您也可以这样做:

dflist <- ls(pattern = "df[1-9]")
Reduce(function(...) full_join(..., by = "ast"), lapply(dflist, get)) %>%
  setNames(c(names(.)[1], dflist)) %>% 
  arrange(ast)
Run Code Online (Sandbox Code Playgroud)