根据出现概率填充缺失值

Fill missing value based on probability of occurrence

这是我的数据。table/dataframe 看起来像

library(data.table)
dt <- fread('
   STATE     ZIP      
   PA        19333        
   PA        19327        
   PA        19333        
   PA        NA        
   PA        19355
   PA        19333
   PA        NA
   PA        19355
   PA        NA     
')

我在 ZIP 列中缺少三个值。我想根据缺失值在数据集中出现的概率,用 ZIPs 的非缺失样本值填充缺失值。因此,例如 ZIP 19333 在数据集中出现了三次,ZIP 19355 在数据集中出现了两次,而 19327 出现了一次。因此,ZIP 19333 在 PA 的数据集中出现的概率为 50%,19355 的概率为 33.33%,19327 的概率为 16.17%。因此 19333 在尝试填充三个缺失的 ZIP 时被选中的概率最高。最终填充的数据集可能如下所示,其中两个缺失值由“19333”填充,一个由“19355”填充:

       STATE     ZIP      
       PA        19333        
       PA        19327        
       PA        19333        
       PA        19333       
       PA        19355
       PA        19333
       PA        19333
       PA        19355
       PA        19355    

我的数据集中有多个 STATE。主要思想是根据给定 STATE.

出现 ZIP 的概率来填充缺失的 ZIP

这是一种使用 sample 的方法,包含在一个方便的函数中。

sample_fill_na = function(x) {
    x_na = is.na(x)
    x[x_na] = sample(x[!x_na], size = sum(x_na), replace = TRUE)
    return(x)
}

dt[, ZIP := sample_fill_na(ZIP), by = STATE]