在R

时间:2016-09-25 02:59:47

标签: r

我只想要一些随机数据来试验不同的预测模型。

我的代码:

x <- 0

for (i in 1:200)
{
    num <- runif(1, 0, 500)
    neg <- round(runif(5, -1, 0))
    percent <- ((0.01 * runif(1, 1, 10)) * num)

    x[i] = num + (neg * percent)
}

这个想法是这应该产生200分。

num是0到500之间的随机数

neg为-1或1,只是为随机偏移(随机生成的点的负偏移或正偏移)添加一些灵活性

percent只是最初生成的随机数的1%到10%之间的随机百分比,可以加上或减去

我用我的主要语言C#编写的代码非常相似,效果非常好并生成了正确的图表。我或多或少试图移植该代码。

每当我运行上述操作时,我都会收到以下错误(很多错误):

number of items to replace is not a multiple of replacement length

它在for循环的最后一行代码中触发。

我希望能够解决这个问题。任何帮助表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:4)

克里斯已经在评论中指出了你的问题。但是,您从R编程预期中做了很多不好的事情。以下方法更好:

N <- 200

d <- data.frame(x = rep(NA, N))

num <- runif(N, 0, 500)
neg <- sample(c(1,-1), 200, replace = TRUE) #jrdnmdhl pointed this out in his post
percent <- ((0.01 * runif(N, 1, 10)) * num)
d$x <- num + (neg * percent)

为什么这样更好?有两个原因,我们避免使用for循环。 R是一种高级语言,因此循环很慢。其次,你没有预先分配你的记忆。跳过此步骤也会减慢速度。 R必须为示例中的每次迭代找到更多内存。

一个很好的资源是Hadley Wickham的高级R,要了解有关第一和第二个原因的更多信息,请阅读thisthat

答案 1 :(得分:2)

评论者提到了主要问题,但如果矢量化,你的代码会快得多。另外,你对'neg'的描述与它正在做的事情不一致。您的代码不会生成-1或1.而是生成-1或0.下面的代码将为neg变量生成-1或1。

num = runif(200, 0, 500)
neg = sample(c(1,-1),200,replace=T)
percent = ((0.01 * runif(200, 1, 10)) * num)
x = num + (neg * percent)