我的数据集目前如下所示:
Contract number FA NAAR q
CM300 9746 47000 0.5010
UL350 80000 0 0.01234
RAD3421 50000 10000 0.9431
我想在0-1之间为每一行添加一个随机生成的数字(称为试验)的列,并将该数字与列q中的值进行比较,如果q<试用,'d'如果q>试验
这是我的代码,它完成了一次这个任务。
trial <- runif(3, min = 0, max = 1)
data2 <- mutate(data, trial)
data2 <- mutate(data, qresult = ifelse(data2$q <= data2$trial, 'l', 'd'))
我的努力是让这个重复进行几次试验,每次重复都会在桌面上添加新的列。我尝试了几种类型的循环,并查看了几个问题,似乎无法弄明白。我是R的新手,所以任何帮助都会受到赞赏!
答案 0 :(得分:2)
您可能希望使用以下方法来解决此问题:
df <- data.frame(contract = c("CM300", "UL350", "RAD3421"),
FA = c(9746, 80000, 50000),
NAAR = c(47000, 0, 10000),
q = c(0.5010, 0.01234, 0.9431))
trialmax <- 10
for(i in 1:trialmax){
trial <- runif(3, min = 0, max = 1)
df[ , paste0("trial", i)] <- trial
df[ , paste0("qresult", i)] <- ifelse(trial >= df$q, "l", "d")
}
在这里,我假设您需要10次试验,但您可以将trialmax
更改为您想要的任何内容。
答案 1 :(得分:0)
我将事物保存在一个单独的矩阵中以提高效率,但最后只将它们绑定在一起。事实上,使用矢量回收,可以非常有效地完成:
n_trials = 20
trials = matrix(runif(n_trials * nrow(data))], ncol = n_trials)
q_result = matrix(c("l", "d")[(trials > data$q) + 1], ncol = n_trials)
colNames(trials) = paste0("trial", seq_len(n_trials))
colNames(q_result) = paste0("qresult", seq_len(n_trials))
data = cbind(data, trials, q_result)