我希望通过预测前9位数字的最后一位数字(第10位)来检查2500个社会安全号码是否满足模数11。所有10个数字都在一列中,如下所示:
前六位数是出生日期(DDMMYY),最后四位数是出生日期。
社会安全号的模数11算法:111111-111X
结论:最后一位数字是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的菜鸟,所以我很感激能得到的所有帮助。
答案 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,则表示为假。有了它,它没有。