r - 按年份生成固定长度的随机id作为字符

标签 r

我想创建固定长度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根据定义。

因此您可以这样做(使用 roundfloorceiling )

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/

相关文章:

r - 使用 Shiny 应用程序更改错误消息

r - 二次形式的公式运算

python - 等同于 Python 中 R 的 removeSparseTerms

r - 如何计算每x步的平均值

r - 如何在一张覆盖有透明度的条形图上绘制两个字符变量的频率

r - 仅在一个方面使用 ggplot 的注释

r - S4 类(class)中是否可以有 S3 插槽?

r - mutate_impl(.data, 点) : binding not found 中的错误

r - 如何重复返回数据帧的函数,然后将所有数据帧组合在一起?

performance - 按列排序或矩阵的 top-n