在R中满足双条件时生成不同随机数的实现方法
解决特定分组生成不重复随机数的问题
你的问题出在rep(rnorm(3,10,2),3)这段代码:先生成3个随机数再重复3次,导致目标行的Value是重复值。要生成独立的随机数,只需为目标行生成对应数量的随机数即可,以下是两种可行方案:
方案一:定位目标行直接赋值
先筛选出Distance=0.5且Age=1的行,再为这些行生成对应数量的独立随机数:
set.seed(321) dat <- data.frame(matrix(ncol = 3, nrow = 27)) colnames(dat)[1:3] <- c("Distance", "Age", "Value") dat$Distance <- rep(c(0.5,1.5,2.5), each = 9) dat$Age <- rep(1:3, times = 9) # 定位目标行 target_rows <- dat$Distance == 0.5 & dat$Age == 1 # 为目标行生成对应数量的随机数 dat$Value[target_rows] <- rnorm(sum(target_rows), 10, 2) # 查看结果 dat[target_rows, ]
方案二:修正ifelse写法
让ifelse的TRUE分支生成与数据框行数相同的随机数,ifelse会自动为每个TRUE位置匹配独立的随机数:
set.seed(321) dat <- data.frame(matrix(ncol = 3, nrow = 27)) colnames(dat)[1:3] <- c("Distance", "Age", "Value") dat$Distance <- rep(c(0.5,1.5,2.5), each = 9) dat$Age <- rep(1:3, times = 9) dat$Value <- ifelse(dat$Distance == 0.5 & dat$Age == 1, rnorm(nrow(dat), 10, 2), NA) # 查看结果 dat[dat$Distance == 0.5 & dat$Age == 1, ]
两种方案都能让目标组合的每行Value得到不同的随机数,运行后可看到类似如下的结果(因set.seed(321)固定了随机种子,结果可复现):
Distance Age Value 1 0.5 1 7.472644 4 0.5 1 10.688895 7 0.5 1 9.264149
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

