【问题标题】:Replacing NAs with random decimals in a particular column in R用 R 中特定列中的随机小数替换 NA
【发布时间】:2019-10-30 11:22:22
【问题描述】:

我正在尝试用 R 中特定列中的随机小数替换 NAs。但是,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。希望这个解释会有所帮助。 我可能遗漏了一些非常明显的东西。提前感谢您的帮助。

【问题讨论】:

  • 您能提供更多信息吗?包括您的数据样本、您获得的输出和所需的输出/
  • 完成...请检查

标签: r na dplyr


【解决方案1】:

您正在使用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。如果满足,则将丢失的值替换为随机数,否则返回原始值(无论是否丢失)。

【讨论】:

  • 感谢您的帮助。知道如何添加条件来替换 NA。例如我只想替换 A 列中值为 1 的 NA .....谢谢
猜你喜欢
  • 2016-05-07
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2017-12-19
  • 2020-06-18
  • 2017-11-16
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多