【发布时间】:2020-05-07 20:20:16
【问题描述】:
我有一个 dataset 有 2 个日历变量(Week & Hour)和 1 个 Amount 变量:
Week Hour Amount
35 1 367
35 2 912
36 1 813
36 2 482
37 1 112
37 2 155
35 1 182
35 2 912
36 1 551
36 2 928
37 1 125
37 2 676
我希望将Amount 的每个值替换为具有相同周/小时对的每个观察值的平均值。例如,这里有 2 个 obs。对于 (Week=35, Hour=1),Amount 的值为 367 和 182。因此,对于此示例,带有 (Week=35, Hour=1) 的 2 行应将 Amount 替换为 mean(c(367,182)。最终输出应该是:
Week Hour Amount
35 1 274.5
35 2 912.0
36 1 682.0
36 2 705.0
37 1 118.5
37 2 415.5
35 1 274.5
35 2 912.0
36 1 682.0
36 2 705.0
37 1 118.5
37 2 415.5
我有以下代码可以解决这个问题。但是,对于具有数千行的完整数据集,它非常慢。有没有办法通过这种配对方式自动重塑?
dataset = data.frame(Week=c(35,35,36,36,37,37,35,35,36,36,37,37),
Hour = c(1,2,1,2,1,2,1,2,1,2,1,2),
Amount = c(367,912,813,482,112,155,182,912,551,928,125,676))
means <- reshape2::dcast(dataset, Week~Hour, value.var="Value", mean)
for (i in 1:nrow(dataset)) {
print(i)
dataset$Amount[i] <- means[means$Week==dataset$Week[i],which(colnames(means)==dataset$Hour[i])]
}
【问题讨论】: