用向量中的随机值填充数据框中的 NA 值(无需替换)

Posted

技术标签:

【中文标题】用向量中的随机值填充数据框中的 NA 值(无需替换)【英文标题】:Fill NA values in a data frame with random values from a vector (without replacement) 【发布时间】:2022-01-23 02:01:22 【问题描述】:

上下文:我正在尝试使用采样值向量填充数据中名为“胆固醇”的列的 NA 值,但是,我找不到任何可以帮助解决此问题的方法。我试过使用replace_na,但它没有替换 NA 值

MRE:

胆固醇数据示例

69 181 308 166 211 257 182  NA  NA  NA  NA  NA  NA  NA
[301]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
[331]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
[361]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
[391]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 260 209 218 228
[421] 213  NA 236  NA  NA 267 166  NA  NA  NA  NA 220 177 236  NA  NA  NA  NA  NA  NA  NA  NA  NA 186 100 228  NA 171 230  NA
[451]  NA  NA 281  NA 203  NA  NA  NA  NA  NA 277  NA 233  NA  NA 240  NA  NA 153 224  NA  NA  NA 316  NA  NA 218  NA 311  NA
[481]  NA  NA 270  NA  NA 217 214 214 252 220 214 203  NA 339 216 276 458 241 384 297 248 308 208 227

将填充 NA 值的向量:

missing_values = sum(is.na(df$Cholesterol))
missing_values
    
# Set seed
set.seed(42)

fill_NA_values_cholesterol = sample(rnorm(n = missing_values, mean = mean(cholesterol_sem_valores_nulos, trim = 0.2), sd = mad(cholesterol_sem_valores_nulos)), size = missing_values)

变量cholesterol_sem_valores_nulos 只是一个不同的向量,只有填充值(NA 不存在于该向量中)

如何使代码使用向量fill_NA_values_cholesterol 填充 NA 值? df$Cholesterol 中存在的 NA 值的数量为 172(与 fill_NA_values_cholesterol 的长度相同)

提前谢谢你

【问题讨论】:

df$Cholesterol[is.na(df$Cholesterol)] <- fill_NA_values_cholesterol 操作系统将所有 NA 值填充为这样的向量:c(309.737491615604, 239.617009170834, 270.46...) 并且不将向量中的单个值归因于 NA 嗯,听起来Cholesterol 可能是list 列?您能否与dput 共享您的示例数据,以便它可以复制/粘贴并包含类和结构信息? dput(head(df))dput(head(df[, "cholesterol", drop = FALSE])) 您是否需要将您的NA 完全替换为向量fill_NA_values_cholesterol,或者您是否可以将每个NA 替换为rnorm(n = 1, mean = mean(cholesterol_sem_valores_nulos, trim = 0.2), sd = mad(cholesterol_sem_valores_nulos)) 生成的值? @GregorThomas 正确,我刚刚使用 typeof(df$Cholesterol) 并且输出是一个列表 【参考方案1】:

这是一个示例,我使用 purrr 和您指定的 rnorm() 函数来替换 NA 值。


library(dplyr)

# Some example data
df <- tibble(
  Cholesterol = c(NA, 1:3, NA)
)

# I make this as a function to save some space underneath, but it is not
# necessary
draw_random_based_on <- function(x) 
  
  rnorm(
    n = 1, 
    mean = mean(x, trim = 0.2, na.rm = TRUE),
    sd = mad(x, na.rm = TRUE)
  )
  


# Under I add a new column - Cholesterol2 - where non missing values are the
# same as Cholesterol, but missing values are replaced by the random function
# you specified
df %>%
  mutate(
    Cholesterol2 = purrr::map_dbl(
      Cholesterol, 
      ~ifelse(
        is.na(.x), 
        draw_random_based_on(df$Cholesterol), 
        .x
      )
    )
  )

【讨论】:

以上是关于用向量中的随机值填充数据框中的 NA 值(无需替换)的主要内容,如果未能解决你的问题,请参考以下文章

用 pandas 数据框中另一列的值填充多列中的 Na

如何使用 tidyr::replace_na 替换数据框中的所有 NA? [复制]

如何用相邻值替换数据框中的 NA(缺失值)

提取特定单元格的值并将其填充以代替 pyspark 数据框中的 NA 值

将列中的 NA 替换为相邻列中的值

R中 如何将数据框中的空值显示为NA