为何使用tidyr的extract函数搭配正则无法拆分duration列
问题原因
你写的正则存在两个核心问题:
- 规则要求字符串必须同时存在h、中间空格、m三个部分,但你的样本里有仅含h(如
2h)或仅含m(如45m)的情况,完全匹配不上所以全返回NA - 正则里
\\s前后额外加了空格,相当于要求匹配「空格+空白符+空格」,和实际样本里h和m之间只有1个空格的格式不符
正确实现代码
library(tidyverse) # 原始数据构造 date <- c("2017-09-30", "2017-10-02", "2017-10-05", "2017-10-07") exercise <- c("gym", "run", "gym", "walk") duration <- c("1h 31m", "45m", "1h 42m", "2h") raw_data <- tibble(date, exercise, duration) # 拆分+计算总分钟 clean_data <- raw_data %>% extract( col = duration, into = c("hours", "minutes"), regex = "(?:(\\d+)h)?\\s*(?:(\\d+)m)?", # 非捕获分组标记可选部分 convert = TRUE # 自动把提取到的数字转成数值类型,不用后续手动转 ) %>% mutate( # 把NA替换为0再计算总时长 total_min = replace_na(hours, 0) * 60 + replace_na(minutes, 0) )
输出结果预览
# A tibble: 4 × 5 date exercise hours minutes total_min <chr> <chr> <int> <int> <dbl> 1 2017-09-30 gym 1 31 91 2 2017-10-02 run NA 45 45 3 2017-10-05 gym 1 42 102 4 2017-10-07 walk 2 NA 120
完全符合你预期的拆分和总时长计算要求。正则里的?:作用是标记该分组仅用来做规则判断,不会被extract捕获为单独的列,搭配?就实现了“有h就提取小时数,没有就留NA”的效果,\\s*匹配0到多个空白,兼容有没有空格的情况。
内容的提问来源于stack exchange,提问作者Anonymous Economist
相关产品推荐
相关产品推荐

