gpt4 book ai didi

r - 如何在 R 中生成自增 ID

转载 作者:行者123 更新时间:2023-12-04 00:13:51 26 4
gpt4 key购买 nike

我正在寻找一种有效的方法来为我正在生成的一些合成数据创建唯一的数字 ID。

现在,我只是有一个函数,它可以从全局变量中发出和递增一个值(参见下面的演示代码)。但是,这很麻烦,因为我必须初始化 idCounter变量,如果可能的话,我宁愿不使用全局变量。

# Emit SSN
idCounter = 0
emitID = function(){
# Turn into a formatted string
id = formatC(idCounter,width=9,flag=0,format="d")

# Increment id counter
idCounter <<- idCounter+1

return(id)
}
record$id = emitID()
uuid包提供了接近我想要的功能,但我需要的 ID 只是整数。有什么建议么?也许是一种将 UUID 值转换为某种数值的方法?显然会发生一些碰撞,但这可能没问题。我认为,我最多需要 10 亿个值。

感谢您的任何建议!

-抢

最佳答案

计数器的非全局版本使用词法范围来封装 idCounter带增量功能

emitID <- local({
idCounter <- -1L
function(){
idCounter <<- idCounter + 1L # increment
formatC(idCounter, width=9, flag=0, format="d") # format & return
}
})

进而
> emitID()
[1] "000000000"
> emitID1()
[1] "000000001"
> idCounter <- 123 ## global variable, not locally scoped idCounter
> emitID()
[1] "000000002"

一个有趣的替代方法是使用“工厂”模式来创建独立的计数器。您的问题意味着您将调用此函数十亿次(嗯,不确定我在哪里得到了那个印象......),所以通过创建一个 id 缓冲区来矢量化对 formatC 的调用是否有意义?
idFactory <- function(buf_n=1000000) {
curr <- 0L
last <- -1L
val <- NULL
function() {
if ((curr %% buf_n) == 0L) {
val <<- formatC(last + seq_len(buf_n), width=9, flag=0, format="d")
last <<- last + buf_n
curr <<- 0L
}
val[curr <<- curr + 1L]
}
}
emitID2 <- idFactory()

然后( emitID1 是上面局部变量版本的一个实例)。
> library(microbenchmark)
> microbenchmark(emitID1(), emitID2(), times=100000)
Unit: microseconds
expr min lq median uq max neval
emitID1() 66.363 70.614 72.310 73.603 13753.96 1e+05
emitID2() 2.240 2.982 4.138 4.676 49593.03 1e+05
> emitID1()
[1] "000100000"
> emitID2()
[1] "000100000"

(原型(prototype)解决方案比 emitID1 慢约 3 倍,尽管速度不是一切)。

关于r - 如何在 R 中生成自增 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25902257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com