首页 > 解决方案 > 从列中提取值

问题描述

我有这个数据集,我只粘贴了几个数据

"73C23" "62R31" "62M26" "58C44" "53R02" NA      "78R58" "76C63" 

我正在尝试编写一个对字符串执行以下操作的函数:必须提取前两个数值并与参数18进行比较。如果> 18必须添加到1900,如果<=必须添加到2000并制作单独的年份列。中心字母必须与此图例进行比较:mesi_legend

head(mesi_legend)
  January February March April May June
      "A" "B" "C" "D" "E" "H"

它写在另一列

虽然对于最后一个最终数字,如果男性必须正常提取,如果女性则减去 40(作为一种区分,我可以使用 > 31,减去 40,但我认为我有误差范围。

我从这个开始:

"GFNNTN78R58G812M"

first step> "78R58"


Output_of_my_function(78R58) > Year 1978
                               Month October
                               Day 18

有人能帮我吗?

标签: r

解决方案


您可以从这里开始,并且很容易扩展。使用gsub和分组我们可以将你的字符串分成 3 部分,用 _ 分隔,这将有助于我们以后使用tidyr::separate得到 Y、M 和 D

> gsub('(\\d{2})([A-Z])(\\d{2})','\\1_\\2_\\3',"73C23") 
[1] "73_C_23"

library(dplyr)
library(tidyr)
df %>% mutate(X1= gsub('(\\d{2})([A-Z])(\\d{2})','\\1_\\2_\\3',X)) %>% 
    separate(X1,sep = '_',into = c('Year','Month','Day')) %>% 
    mutate(
    Month=case_when(Month=='A' ~ 'Jan',
                    Month=='B' ~ 'Feb',
                    Month=='R' ~ 'Oct',
                    TRUE ~ NA_character_),
    Year=if_else(Year>18, paste0(19,Year),paste0(20,Year)),
    Day=if_else(gsub('.*([A-Z])$','\\1',Y)=='M',as.numeric(Day)-40,as.numeric(Day)-30)
  )

数据

df <- data.frame(X=c("78R58","62R31","62M26",NA),
              Y=c("GFNNTN78R58G812M","GFNNTN78R58G812F","GFNNTN78R58G812M",NA))

推荐阅读