How to rbind only the common columns of two data sets

Here is my solution hope i got your question right

df1 <- data.frame(a=rnorm(100), b=rnorm(100), not=rnorm(100))
df2 <- data.frame(a=rnorm(100), b=rnorm(100))

bind1 <- bind1 <- df1[, names(df1) %in% names(df2)]
bind2 <- bind1 <- df1[, names(df2) %in% names(df1)]

rbind(bind1, bind2)

Use intersect to retrieve the common columns.

dfr1 <- data.frame(x = 1:5, y = runif(5), z = rnorm(5))
dfr2 <- data.frame(w = letters[1:5], x = 6:10, y = runif(5))
common_cols <- intersect(colnames(dfr1), colnames(dfr2))
rbind(
  subset(dfr1, select = common_cols), 
  subset(dfr2, select = common_cols)
)

As pointed out in the comments, you can replace the last line with

rbind(
  dfr1[, common_cols], 
  dfr2[, common_cols]
)

for a small performance and typing improvement.

rbind(
  dfr1[common_cols], 
  dfr2[common_cols]
)

also works but I think that it's a tiny bit less clear.


You can also use dplyr equivalents for the last step.

library(dplyr)
bind_rows(
  dfr1 %>% select({common_cols}), 
  dfr2 %>% select({common_cols})
)

Tags:

R