用随机值替换数据帧中的值(存在NA)

时间:2018-12-02 15:50:04

标签: r

请考虑以下数据框,然后将其全部替换为随机值(不相同)。

a<-  c(rep(1,5),rep(NA,6))
b<-  c(rep(NA,5),rep(1,6))    
dat<- cbind(a,b)
dat

       a  b
 [1,]  1 NA
 [2,]  1 NA
 [3,]  1 NA
 [4,]  1 NA
 [5,]  1 NA
 [6,] NA  1
 [7,] NA  1
 [8,] NA  1
 [9,] NA  1
[10,] NA  1
[11,] NA  1

初始解决方案:

dat[dat==1 & !is.na(dat)]<-sapply(dat[dat==1 & !is.na(dat)], function(x) runif(1))
dat
              a         b
  [1,] 0.2334880        NA
  [2,] 0.8845379        NA
  [3,] 0.6637202        NA
  [4,] 0.2647029        NA
  [5,] 0.3889980        NA
  [6,]        NA 0.7698119
  [7,]        NA 0.4197624
  [8,]        NA 0.4120188
  [9,]        NA 0.8229534
 [10,]        NA 0.7535820
 [11,]        NA 0.4248589

第二部分:将其保存到新变量中(dat变量保持不变)

newdat<- some code

2 个答案:

答案 0 :(得分:2)

我们可以获取值为1的值的索引,然后使用runif将它们替换为随机值。

newdat <- dat
inds <- which(newdat == 1)
newdat[inds] <- runif(length(inds))



#                a         b
# [1,] 0.589059571        NA
# [2,] 0.585798106        NA
# [3,] 0.268349643        NA
# [4,] 0.616500063        NA
# [5,] 0.007331229        NA
# [6,]          NA 0.6506516
# [7,]          NA 0.7121793
# [8,]          NA 0.8127495
# [9,]          NA 0.7795301
#[10,]          NA 0.7475504
#[11,]          NA 0.7159547

答案 1 :(得分:2)

We can just multply by the runif as any value multiplied by NA returns NA while those multiplied by 1 returns the value

dat * runif(length(dat))
#             a          b
# [1,] 0.03501729         NA
# [2,] 0.73306529         NA
# [3,] 0.61079151         NA
# [4,] 0.79167747         NA
# [5,] 0.52095513         NA
# [6,]         NA 0.01196499
# [7,]         NA 0.45024003
# [8,]         NA 0.79531526
# [9,]         NA 0.82090048
#[10,]         NA 0.63468136
#[11,]         NA 0.83556364