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