R 将具有相同名称的不同数据帧的列相乘
我有两个数据帧,它们的行数和列数不同,但只有少数列具有相同的名称。我想创建一个dataframe,它具有公共列,并且具有相同名称的列的值相乘我希望它能够自动执行该过程,而不必担心数据帧的大小。 第一数据帧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
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)]
。这当然是可能的。