Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R基于因子标签乘以2个数据帧_R_Dataframe_Apply_Mapply - Fatal编程技术网

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。。尽管我看不出任何理由,如果你只是想把它们相加,为什么你会想/需要在权重中加上零+谢谢你的回复,谢谢你的回复。我肯定我也需要这个中间状态,但对于这个例子,我最终只需要求列的和。谢谢你!