检查1变量以满足R中的模数11

时间:2017-02-16 08:44:45

标签: r

我希望通过预测前9位数字的最后一位数字(第10位)来检查2500个社会安全号码是否满足模数11。所有10个数字都在一列中,如下所示:

  • XXXXXX-XXXX

前六位数是出生日期(DDMMYY),最后四位数是出生日期。

社会安全号的模数11算法:111111-111X

  • 1 1 1 1 1 1 1 1 1
  • x x x x x x x x x
  • 4 3 2 7 6 5 4 3 2
  • = = = = = = = = =
  • 4 + 3 +2 +7 +6 +5 +4 +3 +2 = 36
  • 36 =(3 x 11)+ 3
  • 11 - 3 = 8

结论:最后一位数字是8。

到目前为止,我有这段代码(它不会单独处理每个数字):

CPR$mod11 <- 11 - substr(CPR$CPR,1,1)*4 + substr(CPR$CPR,2,2)*3 +
substr(CPR$CPR,3,3)*2 + substr(CPR$CPR,4,4)*7 + substr(CPR$CPR,5,5)*6 + 
substr(CPR$CPR,6,6)*5 + substr(CPR$CPR,7,7)*4 + 
substr(CPR$CPR,8,8)*3 + substr(CPR$CPR,9,9)*2 %% 11)

我想要的是R分别使用前9个数字,即使所有10个数字都在一列中,并且回调第10个数字是否满足模数11。

我希望这是有道理的 - 我是R的菜鸟,所以我很感激能得到的所有帮助。

2 个答案:

答案 0 :(得分:0)

一些衬垫,可能插入dplyr变异步骤:

嵌套函数,显式中缀

11 - sum(as.numeric(unlist(strsplit(gsub('-','',SN),'')))[1:9] * as.numeric(unlist(strsplit('432765432', '')))) %% 11 == substr(cf, 10, 10)

完全嵌套

'=='('%%'('-'(11,sum('*'(as.numeric(unlist(strsplit(gsub('-','',SN),'')))[1:9],as.numeric(unlist(strsplit('432765432', '')))))),11),substr(cf, 11, 11))

深管道

SN %>% 
    gsub(pat = '-', r = '') %>% 
    strsplit('') %>% 
    unlist %>% 
    as.numeric %>% 
    .[1:9] %>% 
    '*'(as.numeric(unlist(strsplit('432765432', '')))) %>%  
    sum %>%  
    '%%'(11) %>% 
    '-'(11, .)  %>% 
    '=='(substr(cf, 11,11))

并非它们特别有用,更好,甚至可以理解。只是一个有趣的答案。

将此应用于所有SN

library(dplyr)
mydf %>%
    mutate(valid = 11 - sum(as.numeric(unlist(strsplit(gsub('-','',SN),'')))[1:9] * as.numeric(unlist(strsplit('432765432', '')))) %% 11 == substr(cf, 10, 10))

mydf是您的数据,SN是您的SecurityNumber列

答案 1 :(得分:-1)

这解决了它:

check.CPR<- function(x){
  x <- sub("-", "", x) # remove -
  x <- substr(x, 1,10)

  # Calculate digit sum
  x <- as.integer(strsplit(x, "")[[1]])
  num <- as.integer(strsplit("4327654321", "")[[1]])
  digit_sum <- sum(x*num)

  # Check last digit
  0 == (digit_sum %% 11)   
}

Floo0发布的原始函数的问题在于,如果模数等于0,则表示为假。有了它,它没有。