我正在为一个我写了一些R代码的项目工作。但是,在尝试改善运行时时遇到了一些麻烦。
我使用两个数据帧。必须注意,可以在随机行上找到匹配的观察结果。
我想创建第三个数据框(称为“ er”),其中包含每个特定地区/产品/时间组合的所有错误(er_qty)。我使用以下代码成功做到了这一点:
# Examples of data frames 'ac' and 'fc':
ac <- data.frame("Region" = c("R1", "R2", "R3"),
"Product" = c("P1", "P2", "P3"),
"time" = c(1, 2, 2),
"ac_qty" = c(4, 2, 3) )
fc <- data.frame("Region" = c("R2", "R1", "R3"),
"Product" = c("P2", "P1", "P3"),
"time" = c(2, 1, 2),
"fc_qty" = c(2, 1, 3) )
# Copy data frame with forecasts, and expand (separated data frames for later processing)
er <- fc
# Finding corresponding ac_qty for fc_qty with given Region/Product/time:
for (i in 1:length(er$fc_qty)) {
er$ac_qty[i] <- ac$ac_qty[ac$Region == er$Region[i] & ac$Product== er$Product[i] & ac$time == er$time[i] ]
}
er$er_qty <- er$fc_qty- er$ac_qty
由于for循环需要在数据帧中迭代200,000行,因此计算所有值花费大量时间。我需要大大减少脚本的运行时间。我尝试使用with()函数,但在验证后导致错误的值。
er$ac_qty<- with(ac, ac_qty[which(Region == er$Region & Product == er$Product & time == er$time)])
此外,上面的代码给了我这个警告:“较长的对象长度不是较短的对象长度的倍数”
查找与“地区”,“产品”和“时间”列具有相同变量的预测(fc_qty)匹配的需求量(ac_qty)值的最佳方法是什么?
谢谢。
答案 0 :(得分:0)
尝试使用left_join(导入dplyr包),
在这里,我们根据两个数据帧的公共列将它们连接起来
er <- left_join(ac, fc, by = c("Region", "Product", "time") )
er <- mutate(er, er_qty = fc_qty - ac_qty) %>% select(-fc_qty,-ac_qty)
在第二行,我们使用mutate创建一个新列,然后使用select删除fc_qty,ac_qty(select是可选的)
希望获得帮助。