r - 从列中提取值
问题描述
我有这个数据集,我只粘贴了几个数据
"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
有人能帮我吗?
解决方案
您可以从这里开始,并且很容易扩展。使用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))
推荐阅读
- angular - ngx-bootstrap modal cannot read property 'show' of undefined
- modelica - Is there a way to add traceability of source file in fmus?
- azure - Azure VPN Gateway P2S Connected but Azure Resource not connected
- python - 我想将字符串更改为日期时间,但它显示 OutOfBoundsDatetime
- kubernetes - 重新启动操作系统后,Kubernetes coredns pod 进入“已完成”状态
- sql - 如何检查 SQL Server 数据库的恢复状态进度
- swift - 地图功能的部分应用
- python - 无法使用 start_copy_from_url 在 Azure 中复制 blob
- tabulator - 双重可编辑回调
- android - 如何在 Microsoft Azure 上测试 Android 应用