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

R 将具有相同名称的不同数据帧的列相乘,r,dataframe,dplyr,data-analysis,data-transform,R,Dataframe,Dplyr,Data Analysis,Data Transform,我有两个数据帧,它们的行数和列数不同,但只有少数列具有相同的名称。我想创建一个dataframe,它具有公共列,并且具有相同名称的列的值相乘我希望它能够自动执行该过程,而不必担心数据帧的大小。 第一数据帧 Product 1/1/2020 1/1/2019 1/1/2018 1 1 10 1 2 2 20 1

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

第一数据帧

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   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

multCols您能以
dput
格式发布这两个数据帧吗?请使用
dput(df1)
的输出编辑问题。或者,如果输出的dput(head(df1,20))太大
df2也一样。恐怕head()的输出太宽了。您不能子集,只选择一些列吗?通用和非通用名称的混合?两个数据帧的列数合计为1000。所以没有。假设发布的数据按顺序排列,它将是
df1[c(1,2,3,4)]
df2[c(1,2,3,4,5)]
。这当然是可能的。