2015-09-23 4 views
0

У меня есть набор символов, какизвлечь образец с точки подстроки из строки в R

data <- c("ABS Spring Meeting 5.14.15", "DEFG Sellors Tour 10.28.14", "DDCC Fun at the Museum 4.4.15", "GAME CS vs. Washington 11.01.14", "BSS Studio 54 5.13.15","Pas-12 3.5.15") 

Как вы можете заметить, последний набор цифр является дата события. Я хочу, чтобы преобразовать их в дату

date <- c("2015-05-14","2014-10-28","2015-04-04","2014-11-01","2015-05-13","2015-03-05") 

Почувствуйте, как я должен подстроку такого рода ("5.14.15", "10.28.14", "4.4.15", "11.01.14", «5.13. 15 "," 3.5.15 "), затем преобразуйте дату.

Может ли кто-нибудь помочь мне с этим? Спасибо!

+0

Другие символы, такие как «BSS Studio 54 5.13.15», «Pas-12 3.5.15» –

ответ

3

Самый быстрый способ - lubridate. Если поставить общий формат, он будет пытаться понять это для вас:

library(lubridate) 
mdy(data) 
[1] "2015-05-14 UTC" "2014-10-28 UTC" "2015-04-04 UTC" "2014-11-01 UTC" 

Если данные становятся более сложными с другими номерами вы можете использовать метод извлечения строки. Как так:

mdy(sub(".*?([0-9.]+)$","\\1", data)) 

В структуре ".*?([0-9.]+)$":

  • .*? матчи все символы и пробелы. Значок вопроса позволяет полностью сопоставить следующую часть шаблона.

  • ([0-9.]+)$ ищет самый длинный участок цифр и десятичных точек, достигающий конца строки, обозначенной знаком доллара. Скобки создают группу жетонов внутри нее. Мы будем использовать эту группу для следующего шага.

  • "\\1" возвращает группу захвата из рисунка и отбрасывает остальную часть матча.

Существует множество веб-сайтов, которые значительно продвинутся в регулярные выражения, чем я могу. Поскольку он используется почти на всех языках программирования, вам стоит потратить не менее нескольких часов на учебу.

Я многому научился этой бесплатной книге Perl онлайн. Проверьте Ch.5 здесь:

https://www.perl.org/books/beginning-perl/

Этот сайт имеет подраздел упором на R

http://www.regular-expressions.info/rlanguage.html

+3

Это круто и немного тревожно, что 'mdy()' просто игнорирует все посторонние слова ... –

+0

lubridate работает только частично для моей базы данных. Вся моя таблица содержит около 300 имен, есть некоторые другие числа, содержащиеся в названии, например. «BSS Studio 54 5.13.15», то это не работает для этого. –

+0

добавлен метод извлечения. –

2
data <- data <- c("ABS Spring Meeting 5.14.15", 
    "DEFG Sellors Tour 10.28.14", "DDCC Fun at the Museum 4.4.15", 
    "GAME CS vs. Washington 11.01.14", "BSS Studio 54 5.13.15", 
    "Pas-12 3.5.15") 
library("lubridate") 
library("stringr") 

mdy(str_extract(data,"[0-9]+(\\.[0-9]+){2}$")) 
## [1] "2015-05-14 UTC" "2014-10-28 UTC" "2015-04-04 UTC" "2014-11-01 UTC" 
## [5] "2015-05-13 UTC" "2015-03-05 UTC" 

Регулярное выражение "[0-9]+(\\.[0-9]+){2}$" означает «больше, чем одна цифра ([0-9]+), а затем два ({2}) экземпляров (одна точка (\\.), за которой следует более чем одна цифра [0-9]+), а затем конец строка ($

+0

Большое вам спасибо, но можете ли вы объяснить «[0-9] + (\\. [0-9] +) {2} $" немного , Я учусь. –

5

В базовой R, и при условии, что дата всегда в конце строки, вы можете использовать

as.Date(sub(".*\\s", "", data), "%m.%d.%y") 
# [1] "2015-05-14" "2014-10-28" "2015-04-04" "2014-11-01" 

Здесь регулярное выражение просто

  • .* все
  • \\s пробел

Таким образом, это удаляет все до и включая символ конечного пробела.

Смежные вопросы