仅将具有相同列名的列相乘

时间:2018-11-07 22:29:31

标签: r

我有一个数据集,如下所示:

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

我的数据框有很多列,因此,如果可以以任何方式进行动态调整,那将非常有帮助。

2 个答案:

答案 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)