我有这个数据集,我只粘贴了少量数据
"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
有人可以帮我吗?
答案 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))