以独立于数据但仍可重现的方式在循环中设置种子

时间:2016-02-09 22:48:32

标签: r random survey

我知道四个人的names,以及每个人出生的间隔(由birth_lowbirth_high列给出):

> df <- data.frame(id = c(1:4), name = c("john", "john", "leo", "anna"), birth_low = dmy(c("01/01/1978", "01/01/1978", "01/03/1979", "01/03/1979")), birth_high = dmy(c("31/12/1978", "31/12/1978", "30/03/1979", "01/04/1979")))
> df
 id name  birth_low  birth_high
 1  john 01/01/1978  31/12/1978
 2  john 01/01/1978  31/12/1978
 3  leo  01/03/1979  30/03/1979
 4  anna 01/03/1979  01/04/1979

我需要编写一个可重现的代码,为每条记录分配一个随机出生日期DoB。其他考虑因素要求我使用循环:

> for (n in 1:nrow(df)) {
   set.seed(n)
   date <- runif(1,df$birth_low[n], df$birth_high[n])
   date <- ceiling(date) # round up float number
   date <- dmy("01/01/1970") + date 
   date <- format(date, "%d/%m/%Y")
   df$DoB[n] <- date
  }
> df$DoB
 [1] "07/04/1978" "09/03/1978" "05/03/1979" "19/03/1979"

上面代码的一个明显问题是它使用n为每次迭代设置种子。我将不断输入新值,如果df[1,]中的其他人对birth_lowbirth_high具有相同的值,则会生成相同的“随机”日期(“07/04” / 1978" )。

我想通过名称的长度或字母的组合来确定种子,但是这些替代产生了类似的问题(例如,第一行中的每个“约翰”将具有相同的种子)。所以问题实际上是如何以一种独立于数据的方式在循环中设置种子,但仍然可以重现。

有什么想法吗?

0 个答案:

没有答案