从r

时间:2015-09-03 02:05:27

标签: regex r database string


我想从R中的字符串(从数据库导入)中提取一些时间信息(持续时间),并且需要一些关于如何处理此任务的帮助。问题是我想要处理数据库中有数千个持续时间,但它们的格式各不相同。 例如,

字符串

  • 1天
  • 23小时
  • 3-5天
  • 7-10天
  • 48小时

    如您所见,它们因格式而异,有些具有范围,有些具有精确的持续时间,有些具有分隔数字和字母的空格。理想情况下,这些将处理为具有范围的两列,然后是可以计算总持续时间的第三列。 那么,上述数据点的结果将是:

    日;日

  • 1; 1

  • 0.958; 0.958
  • 3; 5
  • 7; 10
  • 2; 2

我想我可能需要一个提取数字并查找关键词的正则表达式。如果单词" hour"被发现,转换为天。如果找到破折号,请找到破折号前后的数字以及关键字"小时/天"。这看起来像是一团糟,但想看看是否有人有想法让我的生活更轻松。

谢谢!

1 个答案:

答案 0 :(得分:1)

提取时间,按-拆分,将它们与小时或天数相匹配,转换回天数:

# recreate your data:
x <- c("1 day", "23 hours", "3-5days", "7-10 days", "48 hours ")

# identify if hours or days    
per <- c("days","hours")[max.col(sapply(c("day","hour"),grepl,x))]
# get the range of values as numeric data
vals <- lapply(strsplit(regmatches(x, regexpr("(\\d+|\\d+-\\d+)",x)),"-"),as.numeric)
# convert to difftime objects and re-format
lapply(Map(as.difftime, vals, units=per), as.numeric, units="days")

#[[1]]
#[1] 1
# 
#[[2]]
#[1] 0.9583333
# 
#[[3]]
#[1] 3 5
#
#[[4]]
#[1]  7 10
# 
#[[5]]
#[1] 2