【发布时间】:2021-08-30 11:20:24
【问题描述】:
第一次在这里提问,如果我遗漏了什么,我深表歉意。我一直在查看现有答案,但找不到任何专门解决此问题的答案。
我正在尝试使用 tidyr 包的提取功能将不一致的字符串拆分为两个变量。
我的数据与库调用的重复:
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)
我想提取到两个单独变量中的字符串是“持续时间”列中的数字。将它们分成标题为“小时”和“分钟”的列,结果如下:
date <- c("2017-09-30", "2017-10-02", "2017-10-05", "2017-10-07")
exercise <- c("gym", "run", "gym", "walk")
hours <- c("1", "NA", "1", "2")
minutes <- c("31", "45", "42", "NA")
raw_data <- tibble(date, exercise, hours, minutes)
...然后我计划使用 mutate 调用以分钟为单位存储整个持续时间(例如 c("91", "45", "102", "120")
到目前为止我的尝试:
clean_data <- raw_data %>%
extract(duration,
c("hours", "minutes"),
"([\\d]+(?=h)) \\s ([\\d]+(?=m))")
所有这些都会产生两列,正确命名为“小时”和“分钟”,但错误地填充了 NA。
我不熟悉正则表达式,所以我认为问题出在某个地方,我尝试了以下方法,它确实提取了正确的值:
str_extract_all(raw_data$duration, "[\\d]+(?=h)")
str_extract_all(raw_data$duration, "[\\d]+(?=m)")
所以我猜我的错误要么与空格有关,但我已经用尽了所有我能想到的选项;或与初始字符串的不一致有关。我发现的所有现有堆栈溢出答案都有一致的字符串。
谁能看出我哪里出错了?提前致谢!
【问题讨论】:
-
试试
raw_data %>% mutate(hours = str_extract(duration, "\\d+(?=h)"), minutes = str_extract(duration, "\\d+(?=m)")) -
... 或更改您的正则表达式以丢失前瞻并使小时和分钟可选(?修饰符)。像这样: (?:(\\d+)h)?\\s+(?:(\\d+)m)?
标签: r regex extract tidyr data-cleaning