在 R 中生成一些简单的虚拟数据
Posted
技术标签:
【中文标题】在 R 中生成一些简单的虚拟数据【英文标题】:Generate some simple dummy data in R 【发布时间】:2017-02-02 14:58:29 【问题描述】:我只是想要一些随机数据来试验不同的预测模型。
我的代码:
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循环的最后一行代码触发。
我希望能够解决这个问题。任何帮助表示赞赏。谢谢!
【问题讨论】:
neg
的长度为 5,因为您为其 n
参数提供了 5。因此,您尝试添加长度为 1 的 num
和长度为 5 的 neg
@Chrisss 我该如何解决这个问题? <-
是唯一的加法运算符吗? =
提供相同的错误
如果 neg
是 -1 或 1,那么你应该这样做:neg = round(runif(200,0,1)) * 2 - 1
因为你的表达式将返回数字 -1 或 0
@KingDan,<-
是赋值运算符,类似于函数assign
。 =
也是一个赋值运算符,但是,它的“权力”更加有限。阅读此***.com/questions/2271575/…
【参考方案1】:
克里斯已经在他的评论中指出了你的问题。但是,从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 的 Advanced R 是一个很好的资源,要了解更多关于第一个和第二个原因的信息,请阅读 this 和 that
【讨论】:
最后只做 d 感谢您的回答 - 根据您的第二行,NA
在 R 中表示什么?
@KingDan NA
表示缺失值。更具体地说,它是一个既不代表TRUE
也不代表FALSE
的逻辑常数。通常使用NA
来预分配内存,因为据推测,当您修改对象时,您将用实际数据替换NA
。但是,您可以使用任何东西预分配内存,例如 9999
。有关NA
的更多信息,请阅读此r-bloggers.com/r-na-vs-null【参考方案2】:
评论者提到了主要问题,但如果矢量化,您的代码会快得多。此外,您对“否定”的描述与其正在做的事情不一致。您的代码不会生成 -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)
【讨论】:
以上是关于在 R 中生成一些简单的虚拟数据的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用edit函数在Rsudio中生成数据编辑器(在windows中生成编辑器)在编辑器中输出需要的数据生成最终的dataframe