以年为单位生成固定长度的随机ID

时间:2015-01-22 10:08:17

标签: r

我想创建固定length 8

的随机ID

以下是示例数据:

x <- data.frame(id=c(1,1,1,2,2,3,3,3,3,4,4), year=c(2001,2001,2001,2010,2010,2002,2002,2002,2002,2005,2005),x=seq(0,0.1,0.01))

我的尝试:

x$new.id <- ave(x$id, x$year, FUN = function(x) rnorm(x,90000000,100000))

对于给定的id'sid

,随机生成的new.id应该等于year

必须有简单的解决方案,但我找不到一个。感谢。

编辑:或者如何为给定的行数创建新的8 digit id

所需的输出:the column new.id should be class character

   new.id year  new.id
   1   1 2001 89957391
   2   1 2001 89957391
   3   1 2001 89957391
   4   2 2010 90331214
   5   2 2010 90331214
   6   3 2002 89995435
   7   3 2002 89995435
   8   3 2002 89995435
   9   3 2002 89995435
   10  4 2005 90058279
   11  4 2005 90058279

1 个答案:

答案 0 :(得分:2)

您与编码方法非常接近(以这种方式使用ave),但如果您想为每个组仅生成一个值,则应通过{{1进入1 s rnorm参数。

我在这里看到的最大问题是,您希望生成一个随机数的类n(然后转换为integer类),而character返回{{1根据定义。

所以你可能会这样做(使用rnormdoubleround

floor

但在我看来,更合适的方法是使用ceiling代替

transform(x, new.id = ave(id, 
                          year, 
                          FUN = function(x) as.character(round(rnorm(1, 9e7, 1e5)))))

编辑:现在我开始考虑更多内容了,对于足够大的数据集,您可能会重复sample因为您独立调用{ {1}}每次都有功能。在我看来,最好的解决方案是首先创建一个数据集,每个indx <- 1e7:(1e8 - 1) transform(x, new.id = ave(id, year, FUN = function(x) as.character(sample(indx, 1)))) 生成一个新索引,同时由单个new.id调用生成,然后将其合并回数据集。使用sample包可以最好地完成此操作(因为它有效连接并且只能在连接时添加单个列),类似下面的内容应该可以正常工作

id

这将通过引用更新原始数据集(无需sample分配)。您只需执行data.table即可转换回library(data.table) y <- data.table(id = unique(x$id), new.id = as.character(sample(indx, length(unique(x$id))))) setkey(setDT(x), id) ; setkey(y, id) x[y, new.id := i.new.id] (如果您愿意)。