gpt4 book ai didi

r - 如何计算 R 中大数的校验位?

转载 作者:行者123 更新时间:2023-12-04 10:30:14 26 4
gpt4 key购买 nike

我必须在 52/200005/0001 之类的数字上添加一个 2 位数的支票(除以 97 的余数)(必须忽略斜线)。

我的代码如下,但由于数字太大而失败:

AppendCheckDigits <- function (x) {
stopifnot(is.character(x) & length(x) == 1 & nchar(x) == 14)
cd <- as.integer(paste(substring(x, 1, 2),
substring(x, 4, 9),
substring(x, 11, 14), sep="")) %% 97
paste(x, "/", cd, sep="")
}

测试它:

AppendCheckDigits("52/200005/0001")

我该如何解决?

最佳答案

integer 类的对象被限制为大约 2*10^9。您应该在函数中使用 as.numeric 而不是 as.integer :

AppendCheckDigits <- function (x) {
stopifnot(is.character(x) & length(x) == 1 & nchar(x) == 14)
cd <- as.numeric(paste(substring(x, 1, 2),
substring(x, 4, 9),
substring(x, 11, 14), sep="")) %% 97
paste(x, "/", cd, sep="")
}

然后:

> AppendCheckDigits("52/200005/0001")
[1] "52/200005/0001/43"

请注意,您可以通过这种方式矢量化和简化您的函数,例如:

AppendCheckDigits <- function (x) {
stopifnot(is.character(x) & nchar(x) == rep(14,length(x)))
num <- as.numeric(gsub("/","", x)) %% 97
return(paste0(x, "/", num))
}

然后:

> AppendCheckDigits(c("52/200005/0001", "52/200005/0021"))
[1] "52/200005/0001/43" "52/200005/0021/63"

关于r - 如何计算 R 中大数的校验位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26181437/

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