我知道四个人的names
,以及每个人出生的间隔(由birth_low
和birth_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_low
和birth_high
具有相同的值,则会生成相同的“随机”日期(“07/04” / 1978" )。
我想通过名称的长度或字母的组合来确定种子,但是这些替代产生了类似的问题(例如,第一行中的每个“约翰”将具有相同的种子)。所以问题实际上是如何以一种独立于数据的方式在循环中设置种子,但仍然可以重现。
有什么想法吗?