Chcę sprawdzić, czy 2500 numerów zabezpieczenia społecznego spełniają moduł 11, przewidywając ostatnią cyfrę (10.) z pierwszych 9 cyfr. Wszystkie 10 cyfr są w jednej kolumnie:

  • XXXXXX-XXXX.

Gdzie pierwsze sześć cyfr jest datą urodzenia (ddmmyy), a ostatnie 4 są podawane po urodzeniu.


Algorytm modułu 11 dla numeru ubezpieczenia społecznego: 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

Wniosek: Ostatnia cyfra byłaby 8.


Do tej pory mam ten kod (który nie będzie obsługiwać każdej cyfry osobno):

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)

Chcę, aby R użyj pierwszych 9 numerów oddzielnie, nawet jeśli wszystkie 10 cyfr są w jednej kolumnie, a oddzwanianie, czy dziesiąta cyfra spełnia moduł 11, czy nie.

Mam nadzieję, że to ma sens - jestem noobem w r, więc doceniam całą pomoc, jakie mogę zdobyć.

r
0
Julie Ravn 16 luty 2017, 11:44

2 odpowiedzi

Najlepsza odpowiedź

To rozwiązało:

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)   
}

Problem z oryginalną funkcją opublikowaną przez FLOO0 było to, że jeśli moduł wyrównał 0, wyjdzie jako false. Z tym nie.

-1
Julie Ravn 22 luty 2017, 15:13

Niektóre wkładki, ewentualnie wstawić do dplyr Mutate Krok:

Funkcja zagnieżdżania, wyraźne infekty

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

W pełni zagnieżdżone.

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

Głębokie rurociąg

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

Nie, że są szczególnie przydatne, lepsze, a nawet zrozumiałe. Tylko fajna odpowiedź.


Aby zastosować to do wszystkich 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))

Gdzie mydf to twoje dane i {x1}} to kolumna numeru bezpieczeństwa

0
GGamba 16 luty 2017, 09:58