首页 > 解决方案 > 用 R 中特定列中的随机小数替换 NA

问题描述

我试图用NAR 中特定列中的随机小数替换 s。但是,R 生成具有相同尾随分数的随机小数,并且只更改小数点前的部分。以下是我尝试过的方法:

df_LT$ATC[is.na(df_LT$ATC)]  <- sample(seq(10.2354897,23.78954214), size=sum(is.na(df_LT$ATC)), replace=T)

dplyr

df_LT <-  df_LT %>%mutate_at(vars(df_LT$ATC), ~replace_na(., sample(10.2354897:23.78954214, size=sum(is.na(ATC)), replace=T)))

数据如下

    A        ATC
    1        11.2356879
    2        42.58974164
    3            NA
    4        34.25382343
    5             NA 

现在,无论在 ATC 列中有 NA 的地方,我都想像其他小数一样添加一个小数,但在 10:23 范围内。希望这个解释会有所帮助。我可能遗漏了一些非常明显的东西。我在这里先向您的帮助表示感谢。

标签: rnadplyr

解决方案


您正在使用seq或冒号运算符:来创建样本,这意味着您正在从以下序列中采样:

seq(10.2354897, 23.78954214)
# [1] 10.23549 11.23549 12.23549 13.23549 14.23549 ....

因此起始值每步增加 1,小数点后的数字保持不变。

如果您想在这两个限制范围内对随机数进行采样,您可以执行以下操作:

runif(n = 1, min = 10.2354897, max = 23.78954214)

因此,对于您的示例,这转化为:

df_LT$ATC[is.na(df_LT$ATC)] <- 
  runif(n = sum(is.na(df_LT$ATC)), 10.2354897, 23.78954214)

如果要添加条件,可以执行以下操作:

df_LT$ATC <- 
  ifelse(is.na(df_LT$ATC) & df_LT$A == 3, 
         runif(n = nrow(df_LT), 10.2354897, 23.78954214), 
         df_LT$ATC)

这将检查 ATC 是否丢失以及 A 是否等于 3。如果满足,则将丢失的值替换为随机数,否则返回原始值(无论是否丢失)。


推荐阅读