I have listed 3 data frames. The 3 data frames have a variable in common and I would like to make a full outer join of the three data frames. I know I can iterate the elements of the list, but is there any other way of making this?
            Asked
            
        
        
            Active
            
        
            Viewed 70 times
        
    3 Answers
3
            I guess you can try Reduce to merge all the data.frames iteratively, e.g.,
Reduce(function(x, y) merge(x, y, all = TRUE), list(df1, df2, df3))
 
    
    
        ThomasIsCoding
        
- 96,636
- 9
- 24
- 81
0
            
            
        If you only have 3 data.frames, I'd recommend joining them manually. Here's a minimal reproducible example:
# 3 data.frames
df1 <- data.frame(a=c(1:3), b=letters[1:3])
df2 <- data.frame(c=c(2,3,4), d=c(letters[1:3]))
df3 <- data.frame(e=c(5:7), f=c(letters[1:3]))
df1
#   a b
# 1 1 a
# 2 2 b
# 3 3 c
df2
#  c d
# 1 2 a
# 2 3 b
# 3 4 c
df3
#  e f
# 1 5 a
# 2 6 b
# 3 7 c
Now full_join them:
library(tidyverse)
df1 %>% 
  full_join(df2, by = c("a"="c")) %>% 
  full_join(df3, by = c("a"="e")) 
#   a    b    d    f
# 1 1    a <NA> <NA>
# 2 2    b    a <NA>
# 3 3    c    b <NA>
# 4 4 <NA>    c <NA>
# 5 5 <NA> <NA>    a
# 6 6 <NA> <NA>    b
# 7 7 <NA> <NA>    c
Note: since you mention the data.frames are inside a list, here's how you could access them:
df_list <- list(df1, df2, df3)
df_list[[1]] %>% 
  full_join(df_list[[2]], by = c("a"="c")) %>% 
  full_join(df_list[[3]], by = c("a"="e")) 
# gives same result as above
 
    
    
        stevec
        
- 41,291
- 27
- 223
- 311
0
            
            
        You can also use purrr's reduce for this, e.g.
library(purrr)
library(dplyr)
purrr::reduce(df_list, full_join, by = "a")
Data:
df1 <- data.frame(a=c(1:3), b=letters[1:3])
df2 <- data.frame(a=c(2,3,4), d=c(letters[1:3]))
df3 <- data.frame(a=c(5:7), f=c(letters[1:3]))
df_list <- list(df1, df2, df3)
Output:
  a    b    d    f
1 1    a <NA> <NA>
2 2    b    a <NA>
3 3    c    b <NA>
4 4 <NA>    c <NA>
5 5 <NA> <NA>    a
6 6 <NA> <NA>    b
7 7 <NA> <NA>    c
 
    
    
        Julian
        
- 6,586
- 2
- 9
- 33
