2015-09-03 2 views
1


Я хотел бы извлечь некоторую информацию о времени (длительности) из строки (импортированной из базы данных) в R и нуждаться в некоторой помощи в том, как я подхожу к этой задаче. Проблема в том, что в базе данных есть тысячи длительностей времени, которые я хотел бы обрабатывать, но они различаются по формату. Например,

извлечение времени из строки в r

Строка

  • 1 день
  • 23 часа
  • 3-5days
  • 7-10 дней
  • 48 часов

    Как вам могут видеть, они v ary по формату, некоторые из них имеют диапазон, некоторые имеют точную продолжительность времени, а некоторые имеют пробелы, разделяющие цифры и буквы. В идеале они обрабатывались бы в два столбца с диапазоном, а затем в третий столбец, который я мог бы вычислить полную продолжительность. Таким образом, результаты вышеуказанных точек данных будет:

    день; день

  • 1; 1

  • 0,958; 0,958
  • 3; 5
  • 7; 10
  • 2; 2

Я думаю, что я, возможно, потребуется регулярное выражение, которое извлекает числа и ищет ключ слова. Если найдено слово «час», сделайте переход к дням. Если найдена тире, найдите числа до и после тире, а также ключевое слово «час/день». Это похоже на беспорядок для работы, но хотелось посмотреть, есть ли у кого-нибудь идеи, чтобы облегчить мою жизнь.

Спасибо!

+0

в основном, вам нужно сделать что-то вроде этого [https://regex101.com /r/wN1eI9/1](https://regex101.com/r/wN1eI9/1), а затем iterater над списком и замените точку с запятой на конце символом '; (такое же число, как и предыдущее)' –

ответ

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