将具有相同名称的不同数据框的列相乘

Multiply columns of different dataframes having the same name

我有两个数据框,它们的行数和列数不同,但名称相同的列很少。我想创建一个具有公共列的数据框,并且具有相同名称的列的值相乘。 我希望它能够自动执行该过程,而不必担心数据帧的大小。

第一个数据帧

Product   1/1/2020     1/1/2019   1/1/2018      
   1          1          10          1          
   2          2          20          1           
   3          3          30          10            
   4          2          10          5            
   5          4           5          10      

这是第二个数据帧

Product    Skill     1/1/2020     1/1/2019   1/1/2018      
   1         W2         1            1          10          
   2         W45        20           1           0           
   3         W0         40           5           0            
   4         W1         50           5           1            
   5         W2         2            2           1      

生成的数据框应该是具有匹配名称的列的值相乘的形式。

Product    Skill     1/1/2020     1/1/2019   1/1/2018      
   1         W2         1           10          10          
   2         W45        40          20           0           
   3         W0         120         150          0            
   4         W1         100         50           5            
   5         W2         8           10          10

这是一个处理发布数据的函数。我相信这是一个通用功能。

multCols <- function(x, y, id = "Product"){
  xnum <- sapply(x, is.numeric)
  ynum <- sapply(y, is.numeric)
  xnames <- names(x)[xnum]
  ynames <- names(y)[ynum]
  xynames <- intersect(xnames, ynames)
  xyid <- intersect(x[[id]], y[[id]])
  i <- match(xyid, x[[id]])
  j <- match(xyid, y[[id]])
  x[i, xynames] * y[j, xynames]
}

multCols(df1, df2)
#  Product 1/1/2020 1/1/2019 1/1/2018
#1       1        1       10       10
#2       4       40       20        0
#3       9      120      150        0
#4      16      100       50        5
#5      25        8       10       10