请考虑以下数据框,然后将其全部替换为随机值(不相同)。
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
答案 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