首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中满足模量11的1变量的检验

R中满足模量11的1变量的检验
EN

Stack Overflow用户
提问于 2017-02-16 08:44:44
回答 2查看 118关注 0票数 1

我希望通过预测前9位数中的最后一位数(第10位),来检查2500个社会保障数字是否达到了模数11。所有10位数字都在一列中,如下所示:

  • XXXXXX

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

社会保障号码的模数11算法:111111-111 X

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

结论:最后一位数为8位。

到目前为止,我有这样的代码(不能单独处理每个数字):

代码语言:javascript
运行
复制
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的菜鸟,所以我很感激我能得到的一切帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-22 15:13:26

这解决了这个问题:

代码语言:javascript
运行
复制
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时,它将是假的。有了这个它就没有了。

票数 0
EN

Stack Overflow用户

发布于 2017-02-16 09:58:25

一些行,可能是插入到dplyr变异步骤中:

嵌套函数,显式前缀

代码语言:javascript
运行
复制
11 - sum(as.numeric(unlist(strsplit(gsub('-','',SN),'')))[1:9] * as.numeric(unlist(strsplit('432765432', '')))) %% 11 == substr(cf, 10, 10)

全嵌套

代码语言:javascript
运行
复制
'=='('%%'('-'(11,sum('*'(as.numeric(unlist(strsplit(gsub('-','',SN),'')))[1:9],as.numeric(unlist(strsplit('432765432', '')))))),11),substr(cf, 11, 11))

深管道

代码语言:javascript
运行
复制
SN %>% 
    gsub(pat = '-', r = '') %>% 
    strsplit('') %>% 
    unlist %>% 
    as.numeric %>% 
    .[1:9] %>% 
    '*'(as.numeric(unlist(strsplit('432765432', '')))) %>%  
    sum %>%  
    '%%'(11) %>% 
    '-'(11, .)  %>% 
    '=='(substr(cf, 11,11))

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

将此应用于所有SN

代码语言:javascript
运行
复制
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列

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42268841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档