我知道有很多类似的问题。但我不是要求同样的!
我的问题是,我所看到的所有问题都是全年的生日,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岁(现在我没有这一年)。 有关说明,请参阅图像:
我不知道是否有任何帮助,但我有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)))))))
我真的希望你能帮我解决这个问题!
答案 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问题。