You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用tidyr的extract函数搭配正则无法拆分duration列

问题原因

你写的正则存在两个核心问题:

  1. 规则要求字符串必须同时存在h、中间空格、m三个部分,但你的样本里有仅含h(如2h)或仅含m(如45m)的情况,完全匹配不上所以全返回NA
  2. 正则里\\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 00:54:06