从列中提取值

时间:2018-10-31 09:44:32

标签: r

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

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

我正在尝试编写一个对字符串执行以下操作的函数: 必须提取前两个数值并将其与参数18进行比较。如果必须将> 18添加到1900中,如果必须将<=添加到2000中并单独创建一个Year列。 中心字母必须与此图例进行比较: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

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

您可以从这里开始,而且很容易扩展。使用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))