R基于因子标签乘以2个数据帧
我有两个数据帧。第一行有多行,第二行只有一行。我需要将第一帧的每一行乘以第二帧的单行。第一个数据帧称为成本,如下所示:R基于因子标签乘以2个数据帧,r,dataframe,apply,mapply,R,Dataframe,Apply,Mapply,我有两个数据帧。第一行有多行,第二行只有一行。我需要将第一帧的每一行乘以第二帧的单行。第一个数据帧称为成本,如下所示: Pounds, Zone.A, Zone.B, Zone.C, Zone.D, Zone.E 5, 10.0, 20.0, 1.00, 23.0, 34.5 10, 20.0, 40.0, 10.0, 34.5, 54.0 15, 40.0, 100.0, 100.0, 67.8, 98.2 Zone.A,
Pounds, Zone.A, Zone.B, Zone.C, Zone.D, Zone.E
5, 10.0, 20.0, 1.00, 23.0, 34.5
10, 20.0, 40.0, 10.0, 34.5, 54.0
15, 40.0, 100.0, 100.0, 67.8, 98.2
Zone.A, Zone.B, Zone.C
0.5, 0.3, 0.2
第二个表名为权重,如下所示:
Pounds, Zone.A, Zone.B, Zone.C, Zone.D, Zone.E
5, 10.0, 20.0, 1.00, 23.0, 34.5
10, 20.0, 40.0, 10.0, 34.5, 54.0
15, 40.0, 100.0, 100.0, 67.8, 98.2
Zone.A, Zone.B, Zone.C
0.5, 0.3, 0.2
当我乘以它们时,如果权重表中缺少一个因子,我需要成本表中相应的因子变成0.0。我想要的结果是:
Pounds, Zone.A, Zone.B, Zone.C, Zone.D, Zone.E
5, 5.0, 6.00, 0.20, 0.0, 0.0
10, 10.0, 12.0, 2.00, 0.0, 0.0
15, 20.0, 30.0, 20.0, 0.0, 0.0
Pounds, Total
5, 11.2
10, 24.0
15, 70.0
之后,我将按行对Zone.*列进行求和,我已经知道如何进行求和,但如果我可以跳过中间步骤,那就太好了。我期待的最终结果是:
Pounds, Zone.A, Zone.B, Zone.C, Zone.D, Zone.E
5, 5.0, 6.00, 0.20, 0.0, 0.0
10, 10.0, 12.0, 2.00, 0.0, 0.0
15, 20.0, 30.0, 20.0, 0.0, 0.0
Pounds, Total
5, 11.2
10, 24.0
15, 70.0
我不知道如何处理没有匹配维度的数据帧,因此非常感谢您的帮助。这里有一个选项:
missing.names <- names(Costs[-1])[!names(Costs[-1]) %in% names(Weights)]
Weights[, missing.names] <- do.call(data.frame, as.list(rep(0, length(missing.names))))
cbind(
Pounds=Costs$Pounds,
Total=rowSums(t(t(as.matrix(Costs[2:ncol(Costs)])) * unlist(Weights2[names(Costs[-1])])))
)
# Pounds Total
# [1,] 5 11.2
# [2,] 10 24.0
# [3,] 15 70.0
还有一种可能性:
library(reshape2)
d1 <- melt(Costs, id.var = "Pounds")
d2 <- melt(Weights)
d1 <- merge(d1, d2, by = "variable", all.x = TRUE)
d1$Total <- with(d1, value.x * value.y)
aggregate(Total ~ Pounds, data = d1, sum, na.rm = TRUE)
# Pounds Total
# 1 5 11.2
# 2 10 24.0
# 3 15 70.0
严格来说,这并不能满足OP的要求,尽管我想结果是一样的,而且用+1的方式要容易得多。@BrodieG-true。。尽管我看不出任何理由,如果你只是想把它们相加,为什么你会想/需要在权重中加上零+谢谢你的回复,谢谢你的回复。我肯定我也需要这个中间状态,但对于这个例子,我最终只需要求列的和。谢谢你!