【问题标题】:Creating list of randomized data-frames with increasing number in names创建名称中数量增加的随机数据框列表
【发布时间】:2017-05-10 09:46:48
【问题描述】:

为了可重复性,我想创建 10 个(工作中:50,000)随机数据帧并设置种子。每个数据帧的种子应该不同,其名称也应该从 df_01、df_02 ... 增加到 df_10。在@akrun 的answer 的帮助下,我编写了一个这样的循环:

# Number of data-frames to be created
n <- 10

# setting a seed vector
x <- 42

# loop
for (i in 1:10) {
        set.seed(x)
        a <- rnorm(10,.9,.05)
        b <- sample(8:200,10,replace=TRUE)
        c <- rnorm(10,80,30)
        lst <- replicate(i, data.frame(a,b,c), simplify=FALSE)
        x <- x+i
}

# name data-frames
names(lst) <- paste0('df', 1:10)

现在我有了我的数据框,但似乎我无法让他随机生成运行。所有数据都相似。当我用以下代码替换 lst-line 时,至少种子随机化有效:

print(data.frame(a,b,c))

一个crackajack extra 将提示dfs 名称中的前导零以便对它们进行排序。

感谢任何帮助,谢谢!

【问题讨论】:

  • 你使用了set.seed(42)。如果你删除它,它应该是随机的。或者n1 &lt;-sample(5000, 1); set.seed(n1)
  • 即使使用 settiing.seed 仅一次代码也不会产生不同的帧,谢谢!

标签: r random


【解决方案1】:

您在所有列表元素中都得到相同的结果,因为您在每次迭代中使用replicate 从头开始​​创建列表并替换之前创建的列表。如果您使用的是for 循环,则不需要replicate

为了重现性,我会在循环之前创建一个种子向量,然后在每次迭代中设置种子。可以使用sprintf 生成前导零:

## Number of random data frames to create:
n <- 10

## Sample vector of seeds:
initSeed <- 1234
set.seed(initSeed)
seedVec <- sample.int(n = 1e8, size = n, replace = FALSE)

## loop:
lst <- lapply(1:n, function(i){
            set.seed(seedVec[i])
            a <- rnorm(10,.9,.05)
            b <- sample(8:200,10,replace=TRUE)
            c <- rnorm(10,80,30)
            data.frame(a,b,c)
        })
## Set names with leading zeroes (2 digits). If you want
## three digits, change "%02d" to "%03d" etc.
names(lst) <- paste0('df', sprintf("%02d", 1:10))

【讨论】:

  • 好的,不知道种子向量。很好的解决方案,谢谢,似乎工作正常!抱歉没有评论我的代码,我已经编辑了。
  • initSeed &lt;- 1234; set.seed(initSeed)而不是set.seed(1234)有什么用?
  • 真的没有区别。你可以同时使用。
猜你喜欢
  • 2017-12-10
  • 1970-01-01
  • 2021-07-09
  • 2020-09-29
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多