2014-10-03 7 views
2

52/200005/0001과 같은 숫자에 2 자리 체크 (97로 나눈 나머지)를 추가해야합니다 (슬래시는 무시해야합니다).R에서 많은 수의 체크 수를 계산하는 방법?

내 코드는 다음과 같다,하지만 때문에 너무 큰 숫자의 실패

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") 
을 를 해결할 수 ?

답변

6

integer의 객체는 약 2 * 10^9로 제한됩니다. 그런 다음

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

:

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" 

주 당신은 당신의 기능에 as.numeric 대신 as.integer를 사용한다 :

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

"내가 그토록 완벽한 대답을 기대하지 않았다"는 것 이외에 무엇을 말할 수 있습니까? 몰라! ;-) – user3341592

+0

코드 AppendCheckDigits <- function (x) { stopifnot (is.character (x) & nchar (x) == 14) num <- as.numeric (gsub ("/", "", x)) %% 97 paste0 (x, "/", num)은 귀하와 같은 방식으로 작동하는 것 같습니다. 여기서 "rep"도없고 "return"도 없습니다. 그것들이 정말로 중요합니까? } – user3341592

+0

@ user3341592 아니, 네가 맞다. 여기서 재활용 규칙으로 'rep'를 사용할 필요가 없다. 코드가 훌륭하고 깨끗합니다. – juba

2

아닌 모든 숫자를 파일 경로를 사용 하도 @의 주바의 대답에 변화 :이 미래 수색자가 비슷한 문제가 있다면,이 대안을 제공 할 수 있습니다 접근 할 수

AppendCheckDigits <- function (x) { 
    stopifnot(is.character(x) & nchar(x) == rep(14,length(x))) 
    num <- as.numeric(gsub("\\D","", x)) %% 97 
    file.path(x, num) 
} 

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

더 다른 방법을.

+0

예, 여기에 대안을 제시하는 것이 좋습니다. 이러한 응답은 읽고 읽으며 유용하다고 판명됩니다! – user3341592

관련 문제