楚新元 | All in R

Welcome to R Square

用 CNID 包获取身份证基本信息

楚新元 / 2024-02-28


身份证号码包含很多信息,但是 CRAN 却没有提取身份证信息的包,真的很掉链子,因此我开发了 CNID 包1。这个包可以帮助您从中国身份证号码中获取出生日期、性别、地区,由此可以根据这些信息进一步得到对年对月的年龄、只对年的年龄、生肖,星座等信息。规则很简单,但我要考虑更多的情况,例如支持 15 位和 18 位号码,身份证号码中可能有逻辑错误的情况,比如 20220229 等,一旦有逻辑错误,一棍子打死也不合适,这让用户很懵,不知道这个身份证到底哪里有问题,因此我对于有逻辑错误的身份证号码仍然尽可能的提取出局部符合逻辑的信息,例如:一个身份证号只是日期有逻辑错误,但是并不妨碍这个身份证号地区和性别的判断。

为了实现以上功能,附带的我还编制了几个辅助函数,check_id() 用来检查身份证号是否符合逻辑,mdays() 用来计算某年某月有多少天,ydays() 用来计算某年有多少天。具体细节不再赘述,我的 CNID 包已经发布到 CRAN,欢迎使用:

检查身份证号码是否有逻辑错误

library(CNID)
id = c(
  "652801197312161555", 
  "130206202202261545",
  "110101841125178"
)
check_id(id)
#> [1] TRUE TRUE TRUE

从身份证号得到全部信息

cnid_info(id)
#> $check_id
#> [1] TRUE TRUE TRUE
#> 
#> $birth_year
#> [1] 1973 2022 1984
#> 
#> $birth_month
#> [1] 12  2 11
#> 
#> $birth_day
#> [1] 16 26 25
#> 
#> $birth_date
#> [1] "1973-12-16" "2022-02-26" "1984-11-25"
#> 
#> $age
#> [1] 50  2 39
#> 
#> $age_by_year
#> [1] 51  2 40
#> 
#> $gender
#> [1] "男" "女" "女"
#> 
#> $region
#> [1] "新疆维吾尔族自治区巴音郭楞蒙古自治州库尔勒市"
#> [2] "河北省唐山市新区"                            
#> [3] "北京市东城区"                                
#> 
#> $zodiac
#> [1] "牛" "虎" "鼠"
#> 
#> $cstl
#> [1] "射手座" "双鱼座" "射手座"

获得出生日期、年龄、性别等

birth_year(id)
#> [1] 1973 2022 1984
birth_month(id)
#> [1] 12  2 11
birth_day(id)
#> [1] 16 26 25
birth_date(id)
#> [1] "1973-12-16" "2022-02-26" "1984-11-25"
age(id)  # 对年对月
#> [1] 50  2 39
age_by_year(id)  # 只对年
#> [1] 51  2 40
gender(id)
#> [1] "男" "女" "女"
region(id)
#> [1] "新疆维吾尔族自治区巴音郭楞蒙古自治州库尔勒市"
#> [2] "河北省唐山市新区"                            
#> [3] "北京市东城区"
zodiac(id)
#> [1] "牛" "虎" "鼠"
cstl(id)
#> [1] "射手座" "双鱼座" "射手座"

代码开源,欢迎读者使用和反馈改进意见和建议,引用请注明出处。


  1. 这个包代码写的有点糟糕需进一步优化,但是暂时不影响使用。 ↩︎