用 R 中的数百万行数据估算 NA

Imputing NA's with millions of rows of data in R

我有一个包含销售订单和销售订单行信息的订单数据集。下面是前几列数据的屏幕截图:

其中销售订单是唯一的,但每个销售订单可以有多个销售订单行。 20%的数据就是我们所说的remakes,这是因为销售订单号与Original Order number列不匹配而被识别的。我们正在尝试建立一个预测模型来预测模型是否会被返回。不幸的是,有 3 列(宽度、高度和织物编号未显示)对于重新制作的销售订单具有 NA。我试图用原始订单号的值来估算那些 NA。

这是我的代码:

for (i in 1:length(hd$SALES_ORDER)){
  if (is.na(hd$WIDTH[i]) == TRUE){
    hd$WIDTH[i] = hd$WIDTH[hd$ORIGINAL_ORDER[i] == hd$SALES_ORDER][1]
  }
}

1 是返回的第一个值,因为可能有多个销售行。我试图匹配销售订单行和原始订单行,但一直收到 'value length' 错误。

我的数据有 300 万多行和 40 万个 na。 for 循环是 运行 但它已经 运行 一个小时了。我很好奇是否有更有效的方法来完成我的任务?

谢谢

这似乎异常缓慢。即使没有任何优化(例如使用 data.table),下面的方法也只需要几秒钟来获取一个 2M 行的数据帧并使用相同的 ORIGINAL_ORDER 为前面的顺序填充 100 万行的 NA。

library(dplyr); library(tidyr)
my_data_million <- data.frame(stringsAsFactors = FALSE, # not necessary for R >4.0.0
                      ORIGINAL_ORDER = rep(1:1000000, 2),
                      SALES_ORDER = 1000000:2999999,
                      WIDTH = c(sample(1:50, 1000000, replace = TRUE), rep(NA, 1000000))
) %>%
slice_sample(n = 2E6, replace = FALSE)   # Shuffling just to show it's still fast


my_data_million %>%
  arrange(ORIGINAL_ORDER, SALES_ORDER) %>%
  group_by(ORIGINAL_ORDER) %>%
  tidyr::fill(WIDTH, .direction = "updown") %>%    #EDIT
  ungroup()