当出生年份只有两个数字时,从个人数字计算年龄

时间:2017-12-29 12:01:04

标签: r date-of-birth

我知道有很多类似的问题。但我不是要求同样的!

我的问题是,我所看到的所有问题都是全年的生日,fx 04/05/1971(格式:%d /%m /%Y)。

我的数据中的生日是丹麦CPR号码(个人识别码),它们看起来像这样:

   ID
1901912222
0110841111
0404143333
1602032444

注意:这些日期就是例子。我有成千上万的行,它是所有年龄段的人,也超过100(但通常不超过17)。

第1和第2号码:出生日期 第3和第4个数字:出生月份 第5和第6个数字:出生年份 最后四个=顺序号。

所以这给了我生日(和年龄):

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

因此格式为:%d%m%y [4位数的连续数]

所以最后四位数(序号)也有一些信息。他们告诉这个人是3岁还是103岁(现在我没有这一年)。 有关说明,请参阅图像:

Birth year and sequential number

我不知道是否有任何帮助,但我有Excel代码:

= YEAR(NOW()) - 1-IF(DATE(YEAR(NOW()); MID(D12; 3; 2); LEFT(D12; 2))< = NOW(); MID(D12 ; 5; 2)+ IF(左(右(D12; 4); 1)* 1·; = 3; 1900; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1 = 4; MID(D12 ; 5; 2)* 1·= 36); 2000; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1 = 4; MID(D12; 5; 2)* 1> = 37); 1900 ; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1> = 5;左(右(D12; 4); 1)* 1·; = 8; MID(D12; 5; 2)* 1·; = 57); 2000; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1> = 5;左(右(D12; 4); 1)* 1·; = 8; MID(D12; 5; 2)* 1> = 58); 1800; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1 = 9; MID(D12; 5; 2)* 1·= 36); 2000 + MID( D12; 5; 2); 1900)))))) - 1; MID(D12; 5; 2)+ IF(左(右(D12; 4); 1)* 1·; = 3; 1900; IF(AND (左(右(D12; 4); 1)* 1 = 4; MID(D12; 5; 2)* 1·= 36); 2000; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1 = 4; MID(D12; 5; 2)* 1> = 37); 1900; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1> = 5;左(右(D12; 4) 1)* 1< = 8; MID(D12; 5; 2)* 1·= 57); 2000; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1> = 5;左(右(D12; 4); 1)* 1·; = 8; MID(D12; 5; 2)* 1> = 58); 1800; IF(AND(LEFT(RIGHT(D12; 4); 1)* 1 = 9 ; MID(D12; 5; 2)* 1·= 36); 2000 + MID(D12; 5; 2); 1900)))))))

我真的希望你能帮我解决这个问题!

1 个答案:

答案 0 :(得分:4)

困难的部分是从id中提取实际出生日期。以下函数通过创建三个数组来查找“19”或“20”,具体取决于年份是00-36,37-57还是58-99。它以标准格式"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 = "-")
}

例如:

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

产量:

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

一旦您以标准的4位数年份格式过生日,就很容易计算年龄。请参阅this问题。