Использовать инфиксный оператор %in%
быстрее.
names(df2)[names(df2) %in% names(df1)]
Протестировано с пакетом microbenchmark
.
mb <- microbenchmark(
Intersect = intersect(names(df1), names(df2)),
In = names(df2)[names(df2) %in% names(df1)]
)
print(mb, unit = 'relative', order = 'median')
#Unit: relative
# expr min lq mean median uq max neval
# In 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 100
# Intersect 5.536585 5.335227 3.530118 4.497696 5.053942 1.339408 100
Тестовые данные
set.seed(2020)
df1 <- as.data.frame(as.list(1:10))
names(df1) <- sprintf("Col%d", c(1:3, 6:10, 14, 15))
df2 <- as.data.frame(t(replicate(1e2, sample(20, 10))))
names(df2) <- sprintf("Col%d", c(1:5, 7:10, 12))