我想对我的相当大的数据集执行两件事10 K x 50 K
。以下是较小的一组200 x 10000
。
首先,我想生成5%的缺失值,这也许很简单,并且可以通过简单的技巧完成:
# dummy data
set.seed(123)
# matrix of X variable
xmat <- matrix(sample(0:4, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
在数据的5%随机位置生成缺失值。
N <- 2000000*0.05 # 5% random missing values
inds_miss <- round ( runif(N, 1, length(xmat)) )
xmat[inds_miss] <- NA
现在,我想生成错误(表示与上面矩阵中的值不同的值。上面的矩阵的值为0到4。所以我想做的是:
(1)我想用另一个非x的值替换x值(例如0可以用非0的随机样本替换(即1或2或3或4),类似地,1可以替换为而不是1(即0或2或3或4)。可以用以下方法简单地替换可替换随机值的指标:
inds_err <- round ( runif(N, 1, length(xmat)) )
如果我随机采样0:4值并替换为索引,这有时会将相同的值替换为相同的值(0替换为0,1替换为1,依此类推),而不会产生错误。
errorg <- sample(0:4, length(inds_err), replace = TRUE)
xmat[inds_err] <- errorg
(2)所以我想做的是在xmat中引入缺少值的错误,但是我不想NA
在上述步骤中将生成的值替换为一个值(0到4)。因此,ind_err
不应成为vector的成员inds_miss
。
所以总结规则:
(1)缺失值不应替换为错误值
(2)现有值必须替换为其他值(此处是错误的定义)-在随机采样中,这样做的概率为1/5。
怎么做到呢 ?我需要可以在大型数据集中使用的更快的解决方案。
您可以尝试以下方法:
inds_err <- setdiff(round ( runif(2*N, 1, length(xmat)) ),inds_miss)[1:N]
xmat[inds_err]<-(xmat[inds_err]+sample(4,N,replace=TRUE))%%5
在第一行中,您生成2*N
可能的错误索引,inds_miss
然后减去属于的错误索引,然后取第一个N。在第二行中,将值添加到要在1到4之间更改随机数的值,然后取mod 5通过这种方式,您可以确保新值将与原始值和stil在0-4范围内不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句