df1[] <- mapply(function(nm, dat) if (nm %in% names(df2) && is.numeric(dat)) dat*df2[[nm]] else dat,
names(df1), df1, SIMPLIFY=FALSE)
df1
# Col1 Col2 A B C
# 1 A 1 4 9 16
# 2 B 2 10 21 32
df1[] <- ...
является эффективным (хотя и не совсем) ярлыком df1 <- as.data.frame(...)
.
Я как раз собирался предложить intersect
, когда пришел ответ Юлиуса ... но я включу его для полноты (поскольку остальная часть этого ответа немного отличается):
df1[intersect(names(df1), names(df2))] <-
mapply(function(nm, dat) dat*df2[[nm]],
intersect(names(df1), names(df2)), df1[intersect(names(df1), names(df2))], SIMPLIFY=FALSE)