2017-12-29 6 views
5

Ich weiß, dass es viele Fragen gibt, die diesem ähneln. ABER ich frage nicht das Gleiche!Berechne das Alter von der persönlichen Nummer, wenn das Geburtsjahr nur zwei Zahlen hat

Mein Problem ist, dass alle Fragen, die ich mir angesehen habe, Geburtstage mit dem ganzen Jahr haben, fx 04/05/1971 (Format:% d /% m /% Y).

Die Geburtstage in meinen Daten dänische CPR-Nummern (persönliche Identifikationsnummern), und sie sehen wie folgt aus:

ID 
1901912222 
0110841111 
0404143333 
1602032444 

NB: Diese Termine sind Beispiele. Ich habe Tausende von Reihen und es sind Menschen in jedem Alter, auch über 100 (aber meistens nicht mehr als 17).

1. und 2. Nummer: Tag der Geburt 3. und 4. Zahl: Geburtsmonat 5. und 6. Zahl: Geburtsjahr Die letzte vier = Laufende Nummer.

So gibt das mir die Geburtstage (und Alter):

ID   birthdate  age 
1901912222 19/09/91  26 
0110841111 01/10/84  33 
0404143333 04/04/14  103 
1602024444 16/02/02  15 

So ist das Format:% d% m% y [die laufende Nummer von 4 Ziffern]

So sind die letzten vier Ziffern (die laufende Nummer) hat auch einige Informationen. Sie sagen, ob die Person 3 oder 103 Jahre alt ist (jetzt, da ich das Jahr nicht habe). Siehe das Bild zur Beschreibung:

Birth year and sequential number

Ich weiß nicht, ob es irgendeine Hilfe ist, aber ich habe den Excel-Code:

= YEAR (NOW()) - 1-IF (DATE (YEAR (NOW()); MID (D12; 3; 2); LINKS (D12; 2)) < = NOW(); MID (D12; 5; 2) + IF (LINKS (RECHTS (D12; 4); 1) * 1 < = 3; 1900; IF (UND (LINKS (RECHTS (D12; 4); 1) * 1 = 4; MID (D12; 5; 2) * 1 < = 36); 2000; IF (AND (LINKS (RECHTS (D12; 4); 1) * 1 = 4; MID (D12; 5; 2) * 1> = 37); 1900; IF (UND (LINKS (RECHTS (D12; 4); 1) * 1> = 5; LINKS (RECHTS (D12; 4); 1) * 1 < = 8; MID (D12; 5; 2) * 1 < = 57); 2000; IF (UND (LINKS (RECHTS (D12; 4); 1) * 1> = 5; LINKS (R IGHT (D12; 4); 1) * 1 < = 8; MID (D12; 5; 2) * 1> = 58); 1800; IF (UND (LINKS (RECHTS (D12; 4); 1) * 1 = 9; MID (D12; 5; 2) * 1 < = 36); 2000 + MID (D12; 5; 2); 1900)))))) - 1; MID (D12; 5; 2) + IF (LINKS (RECHTS (D12; 4); 1) * 1 < = 3; 1900; IF (UND (LINKS (RECHTS (D12; 4); 1) * 1 = 4; MITTEL (D12; 5; 2) * 1 < = 36); 2000; IF (UND (LINKS (RECHTS (D12; 4); 1) * 1 = 4; MID (D12; 5; 2) * 1> = 37); 1900; IF (UND (LINKS (RECHTS (D12; 4); 1) * 1> = 5; LINKS (RECHTS (D12; 4); 1) * 1 < = 8; MID (D12; 5; 2) * 1 < = 57); 2000; IF (AND (LINKS (RECHTS (D12; 4); 1) * 1> = 5; LINKS (RECHTS (D12; 4); 1) * 1 < = 8; MITTEL (D12; 5; 2) * 1> = 58); 1800; IF (UND (LINKS (RECHTS (D12; 4); 1) * 1 = 9; MID (D12; 5; 2) * 1 < = 36); 2000 + MITTEL (D12; 5; 2); 1900)))))))

Ich hoffe wirklich, Sie können mir bei diesem Problem helfen!

Antwort

4

Der schwierige Teil extrahiert das tatsächliche Geburtsdatum von der ID. Die folgende Funktion erstellt dies, indem drei Arrays erstellt werden, um nach "19" oder "20" zu suchen, abhängig davon, ob das Jahr 00-36, 37-57 oder 58-99 ist.Sie gibt die Daten im Standardformat "yyyy-mm-dd":

A <- c(rep("19",4),rep("20",6)) 
B <- c(rep("19",5),rep("20",4),"19") 
C <- c(rep("19",5),rep("18",4),"19") 
birthday <- function(code){ 
    day <- substr(code,1,2) 
    month <- substr(code,3,4) 
    year <- substr(code,5,6) 
    snum <- 1+as.numeric(substr(code,7,7)) 
    prefix <- ifelse(as.numeric(year) <= 36,A[snum],ifelse(as.numeric(year)<=57,B[snum],C[snum])) 
    year <- paste0(prefix,year) 
    paste(year,month,day,sep = "-") 
} 

Zum Beispiel:

df <- data.frame(ID = c("1901912222","0110841111","0404143333","1602024444")) 
df$BD <- birthday(df$ID) 

Nachgeben:

  ID   BD 
1 1901912222 1991-01-19 
2 0110841111 1984-10-01 
3 0404143333 1914-04-04 
4 1602024444 2002-02-16 

Sobald Sie den Geburtstag in der Standard-4-stelliger Jahr Format haben, es ist einfach genug, um z berechne das Alter. Siehe this Frage.

Verwandte Themen