将随机缺失值的确切比例添加到data.frame

age*_*nis 5 random r missing-data na

我想随机添加NA到R中的data.frame.到目前为止,我已经研究了这些问题:

R:按比例随机将NAs插入数据帧

如何将随机NAs 添加到数据框中

将随机缺失值添加到完整数据框中(在R中)

这里提供了许多解决方案,但我找不到符合这5个条件的解决方案:

  • 添加非常随机的NA,而不是按行或按列添加相同的量
  • 处理data.frame(数字,字符,因子,逻辑,ts ..)中可能遇到的每个变量类,因此输出必须与输入data.frame或matrix具有相同的格式.
  • 保证输出中NA 的精确数量或比例[注意](许多解决方案导致NA的数量较少,因为在同一位置生成了多个NA)
  • 计算是否对大数据集有效.
  • 在输入中独立于已存在的NA添加NA的比例/数量.

有人有想法吗?我已经尝试编写一个函数来执行此操作(在第一个链接的答案中)但它不符合N°3和4点.谢谢.

[注意]确切的比例,当然是+/- 1NA.

Ale*_*x W 6

这就是我为library(imputeMulti)JSS目前正在审核的论文所做的工作.这将插入NA到整个数据集的随机百分比并且可以很好地扩展,由于具体情况,它不能保证确切的数字n * p * pctNA %% 1 != 0.

createNAs <- function (x, pctNA = 0.1) {
  n <- nrow(x)
  p <- ncol(x)
  NAloc <- rep(FALSE, n * p)
  NAloc[sample.int(n * p, floor(n * p * pctNA))] <- TRUE
  x[matrix(NAloc, nrow = n, ncol = p)] <- NA
  return(x)
}
Run Code Online (Sandbox Code Playgroud)

显然,您应该使用随机种子进行重现性,可以在函数调用之前指定.

这可作为创建基线数据集的一般策略,以便在插补方法之间进行比较.我相信这是你想要的,虽然你的问题(如评论中所述)没有明确说明.

编辑:我认为这x是完整的.所以,我不确定它将如何处理现有的缺失数据.如果你愿意,你当然可以修改代码,尽管这可能会使运行时间增加至少O(n*p)