基于以下数据框:
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)
你可以使用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)