在分组的数据框中插入缺失值

问题描述 投票:0回答:1

我是在分组数据框中插入缺失值。在DF内,Var1Var2的缺失值被随机分配。

数据帧按变量Factory:MachineNum分组。在这些分组中按Odometer的顺序进行插补。

该代码大约可以在5-10%的时间内正常运行。它说的其他90-95%的时间;

"Error: Column Impute must be length 50 (the group size) or one, not 49".

我认为这可能与缺失值的随机性有关。也许当至少1行共享2个缺失值时。

如何使此代码更健壮?

通过多次运行整个代码,您会发现它大约可以完成5-10%的尝试,并且最终会产生Results数据帧。

library(dplyr)
library(tidyr)

# Create dataframe with some missing values in Var1 and Var2
DF <- data.frame(Factory = c(replicate(150,"Factory_A"), replicate(150,"Factory_B")),
                 MachineNum = c(replicate(100,"Machine01"), replicate(100,"Machine02"), replicate(100,"Machine03")),
                 Odometer = c(replicate(1,sample(1:1000,100,rep=FALSE)), replicate(1,sample(5000:7000,100,rep=FALSE)), replicate(1,sample(10000:11500,100,rep=FALSE))),
                 Var1 =c(replicate(1, sample(c(2:10, NA), 100, rep = TRUE)), replicate(1, sample(c(15:20, NA), 100, rep = TRUE)), replicate(1, sample(c(18:24, NA), 100, rep = TRUE))),
                 Var2 = c(replicate(1, sample(c(110:130, NA), 100, rep = TRUE)), replicate(1, sample(c(160:170, NA), 100, rep = TRUE)), replicate(1, sample(c(220:230, NA), 100, rep = TRUE)))
)




# Variables with missing values that need imputing
cols <- grep('Var', names(DF), value = TRUE)

# Group-wise impution of missing values
library(stinepack)
Models <- DF %>%
  pivot_longer(cols = starts_with('Var')) %>%
  arrange(Factory, MachineNum, name, Odometer) %>%
  group_by(Factory, MachineNum, name) %>%
  mutate(Impute = na.stinterp(value, along = time(Odometer), na.rm = TRUE))



# Convert results from long to wide to visually inspect
Results <- Models %>% 
  group_by(Factory, MachineNum, name) %>% 
  mutate(row = row_number()) %>% 
  tidyr::pivot_wider(names_from = name, values_from = c(value, Impute))
r dplyr grouping multiple-columns imputation
1个回答
2
投票

当组中有NA的前尾时,会出现erorr,并且由于您有na.rm = TRUE,因此删除它们会使组不平衡。

如果将na.rm保留为FALSE,则将NA保留为NA,并且可以正常运行。

library(dplyr)
library(stinepack)

DF %>%
  pivot_longer(cols = starts_with('Var')) %>%
  arrange(Factory, MachineNum, name, Odometer) %>%
  group_by(Factory, MachineNum, name) %>%
  mutate(Impute = na.stinterp(value, along = time(Odometer), na.rm = FALSE))
© www.soinside.com 2019 - 2024. All rights reserved.