我想创建固定长度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
和年份
,随机生成的new.id应该具有相同的id
一定有简单的解决方案,但我找不到。谢谢。
编辑:或者如何为给定的行数创建新的8位ID
。
所需的输出:new.id 列应该是类字符
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
最佳答案
您的编码方法非常接近(以这种方式使用ave
),但如果您只想为每个组生成一个值,则应该传递1
进入rnorm
n
范围。
我在这里看到的最大问题是,您想要生成类 integer
的随机数(然后转换为character
类)而rnorm
返回double
根据定义。
因此您可以这样做(使用 round
或 floor
或 ceiling
)
transform(x, new.id = ave(id,
year,
FUN = function(x) as.character(round(rnorm(1, 9e7, 1e5)))))
但在我看来,更合适的方法是使用 sample
相反
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]
这将通过引用更新您的原始数据集(无需 <-
分配)。您可以转换回data.frame
(如果您愿意)只需执行 setDF(x)
.
关于r - 按年份生成固定长度的随机id作为字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28086023/