用 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()
我有一个包含销售订单和销售订单行信息的订单数据集。下面是前几列数据的屏幕截图:
其中销售订单是唯一的,但每个销售订单可以有多个销售订单行。 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()