【问题标题】:Replace randomly 1000 NA Values in a dataframe column with 0s, without overwriting 1s用 0 随机替换数据框列中的 1000 个 NA 值,而不覆盖 1
【发布时间】:2022-01-12 15:41:26
【问题描述】:

我正在尝试用 0 随机替换数据框列中的 1000 个 NA 值。该列仅由 NA 和 1 组成,如下所示:

  Column
1 NA
2 1    
3 NA    
4 NA    
5 NA    
6 1    
7 NA
...

我希望它看起来像这样:

  Column
1 0
2 1    
3 NA    
4 0    
5 NA    
6 1    
7 NA
...

我正在处理的列有 1000 多行,所以最后会有 0 和 NA 的空间。

我尝试过这样的事情:

is.na(df_col[sample(seq(nrow(is.na(df_col))), 1000), "Column"]) <- 0

但是,这不起作用。没有 NA 值被替换。如果我取出 is.na()s 它可以工作,但值 1 可能会被替换,我不希望这样。你知道如何解决这个问题吗?

【问题讨论】:

  • 你有两次is.na。和sample?试试df_col[is.na(df_col[,"Column"]),"Column"] &lt;- 0

标签: r random replace na zero


【解决方案1】:

我假设您要替换 1,000 个 NA 值,而不是选择 1,000 个索引并在它们为 NA 时替换它们。以下代码查找 NA 值的索引,然后将 1,000 个这些索引的随机样本替换为 0。

set.seed(123)
df <- tibble(x = rep(c(1, NA), times = 2000))
indices <- which(is.na(df$x))
df[sample(indices, 1000, replace = FALSE), "x"] <- 0

【讨论】:

  • 是的,我试图直接替换而不是通过索引。但是,您的解决方案似乎工作得很好。不过,只有一个问题。如果我的数据框只是一列,我可以将其名称写在您放置 df$x 的位置吗?或者这有什么问题吗?非常感谢!
  • 如果您不想将索引存储在变量中,只需将sample() 中的indices 替换为which(is.na) 位即可。但是,是的,用 df 替换 df$x 应该适用于您的情况。
  • 好的,会这样做。再次感谢您的帮助。
猜你喜欢
  • 2019-03-06
  • 2017-11-11
  • 2017-06-25
  • 2018-09-07
  • 2022-01-23
  • 2022-01-20
  • 2022-11-29
  • 2021-01-10
  • 2014-11-04
相关资源
最近更新 更多