我希望通过预测前9位数中的最后一位数(第10位),来检查2500个社会保障数字是否达到了模数11。所有10位数字都在一列中,如下所示:
前六位是出生日期(DDMMYY),最后四位是出生时。
社会保障号码的模数11算法:111111-111 X
结论:最后一位数为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的菜鸟,所以我很感激我能得到的一切帮助。
发布于 2017-02-22 15:13:26
这解决了这个问题:
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时,它将是假的。有了这个它就没有了。
发布于 2017-02-16 09:58:25
一些行,可能是插入到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列
https://stackoverflow.com/questions/42268841
复制相似问题