我正在尝试创建一个数据集,其中包含具有特定属性的随机生成值:
- 所有大于0的正整数
- 在两列(x,y)中,它们的和相等(sum(x) == sum(y))
- 具有近似正态分布
我已经成功地创建了一些接近所需数据的生成器,但速度非常慢。 我认为这是由于while循环导致的。
simSession <- function(sessionid = 1) {
s <- data.frame(sessionid = sessionid, userid = seq(1:12))
total <- sample(48:72, 1)
mu = total / 4
sigma = 3
s$x <- as.integer(rnorm(mean=mu, sd=sigma, n=nrow(s)))
while(sum(s$x) > total) {
# i <- sample(nrow(s), 1)
i <- sample(rep(s$userid, s$x), 1)
if(s[i, ]$x > 1) {
s[i, ]$x <- s[i, ]$x - 1
} else {
s[i, ]$x = 1
}
}
s$y <- as.integer(rnorm(mean=mu, sd=sigma, n=nrow(s)))
while(sum(s$y) > sum(s$x)) {
# i <- sample(nrow(s), 1)
i <- sample(rep(s$userid, s$y), 1)
if(s[i, ]$y > 1) {
s[i, ]$y <- s[i, ]$y - 1
} else {
s[i, ]$y = 1
}
}
s$xyr <- s$x / s$y
return(s)
}
有没有什么明显的问题我忽略了,可以使这个问题更容易解决或者有更快的替代函数?
此外,如果能指定一个参数来偏移模式到左或右将会得到额外的分数。