我有一个数据集,如下所示:
df1
Col1 Col2 A B C
A 1 2 3 4
B 2 5 7 8
df2
A B C D E
2 3 4 7 10
我只想乘以两个数据框中匹配的列。
最终预期输出:
Col1 Col2 A B C
A 1 4 9 16
B 2 10 21 32
我的数据框有很多列,因此,如果可以以任何方式进行动态调整,那将非常有帮助。
答案 0 :(得分:3)
nm <- intersect(names(df1), names(df2))
df1[nm] <- sweep(df1[nm], 2, unlist(df2[nm]), `*`)
df1
# Col1 Col2 A B C
# 1 A 1 4 9 16
# 2 B 2 10 21 32
使用sweep
是这里的主要技巧。
答案 1 :(得分:2)
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(...)
的快捷方式。
当朱利叶斯(Julius)的答案出现时,我正要建议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)