首页 > 解决方案 > 如何提取 10 个字符数的前 6 位数字并将其转换为 as.Date?

问题描述

假设我有 10 位数字代表存储的社会安全号码(在这个例子中显然是假的)as.character()

df <- data.frame(number = as.character(c("1208891384", "2105650124", "0102018213")))

> df
      number
1 1208891384
2 2105650124
3 0102018213

社保号代表ddmmyy-xxxx。我想ddmmyy从字符串中提取这些并创建一个包含 6 个数字的新协变量as.Date()

我希望有一个解决方案dplyr

预期产出

> df
      number          date
1 1208891384    1989-08-12
2 2105650124    1965-05-21
3 0102018213    2001-02-01

str(df)
'data.frame':   6 obs. of  2 variable:
 $ number: chr  "1208891384" "2105650124" "0102018213"
 $ date      : Date, format: 1989-08-12 1965-05-21 ...

更新

在我的数据上尝试了以下方法。然后收到一个错误。

pp <- structure(list(cpr = c("0311611951", "1902521268", "1209470762"
)), row.names = c(NA, -3L), class = "data.frame") 

pp %>% mutate(b_day=substr(cpr,1,2),
       month=substr(cpr,3,4),
       year=as.numeric(substr(cpr,5,6)),
       date=as.Date(substr(cpr,1,6),'%d%m%y'),
       yearcheck=as.numeric(format(date,'%Y')),
       year2=ifelse(yearcheck>format(Sys.Date(),'%Y'),yearcheck-100,yearcheck),
       Date=as.Date(paste0(as.character(year2),month,day),'%Y%m%d'))

mutate()输入问题Date。x 无法将类型“闭包”强制转换为“字符”类型的向量 ℹ 输入Dateas.Date(paste0(as.character(year2), month, day), "%Y%m%d"). 运行 rlang::last_error()以查看错误发生的位置。

标签: rstringdataframedatedplyr

解决方案


尝试这个。注意年份,因为 1970 年之前的某些日期R无法正确转换。这里的代码:

library(dplyr)
#Data
df <- data.frame(number = as.character(c("1208891384", "2105650124", "0102018213")))
#Code
df <- df %>% mutate(day=substr(number,1,2),
              month=substr(number,3,4),
              year=as.numeric(substr(number,5,6)),
              date=as.Date(substr(number,1,6),'%d%m%y'),
              yearcheck=as.numeric(format(date,'%Y')),
              year2=ifelse(yearcheck>as.numeric(format(Sys.Date(),'%Y')),yearcheck-100,yearcheck),
              Date=as.Date(paste0(as.character(year2),month,day),'%Y%m%d')) %>%
  select(c(number,Date))

输出:

      number       Date
1 1208891384 1989-08-12
2 2105650124 1965-05-21
3 0102018213 2001-02-01

推荐阅读