用向量中的随机值填充数据框中的 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 值(无需替换)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 tidyr::replace_na 替换数据框中的所有 NA? [复制]