R ищет конкретные строковые шаблоны (часть 2) - PullRequest
0 голосов
/ 07 февраля 2019

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

Раньше я думал, что мое соглашение об именовании файлов было толькоэти форматы:

"aaaaa-ttttt-eeee-q4-2015-file"
"aaaaaa-fffff-3333-q2-2012-file"

или, в частности, это квартал , за которым следуют "-" , затем год .

Однако при дальнейшем исследовании файлы имеют другие варианты, такие как:

"aaaaaa-f2q09-bbbbb"
"aaaaaa-f2q2008-bbbbb"
"aaaaaa-f4q-2008-fffff"
"f4q-aaaaa-eeeeee-2008"
"q2-aaaaaaaaa-eeeeeee-2005"
"aaaaaaaa-3q-2008-rrrrrrr"

Аналогично для всего вышеперечисленного, я хотел бы извлечь год и квартал и я не уверен, есть ли общий код, который я могу написать, который может извлечь их все сразу, или мне нужно написать несколько наборов кода и выполнить их волнами.Не очень хорошо знаком с подфункцией в R, и на самом деле был бы признателен, если бы кто-нибудь указал мне на веб-сайт с подробными объяснениями и примерами, чтобы я мог написать собственный код для извлечения этой информации.

В конечном счете, код должен анализироватьсявсе эти строки и выводят что-то вроде: год = 2005 , квартал = q4 и т. д.

1 Ответ

0 голосов
/ 07 февраля 2019

Попробуйте, это использует regexpr, чтобы показать местоположение совпадения, и regmatches, чтобы вернуть их, это очень восприимчиво, чтобы извлечь неверные данные.За квартал он вернет любой экземпляр 1-4, сопровождаемый или предшествующий q.Если есть какая-либо другая информация, которая может сделать эти более конкретные совпадения, чем я предлагаю, включив их.

input=c("aaaaaa-f2q09-bbbbb",
"aaaaaa-f2q2008-bbbbb",
"aaaaaa-f4q-2008-fffff",
"f4q-aaaaa-eeeeee-2008",
"q2-aaaaaaaaa-eeeeeee-2005",
"aaaaaaaa-3q-2008-rrrrrrr")


quarter=regmatches(input, regexpr("[1-4]q|q[1-4]", input))
year = regmatches(input, regexpr("q\\d{4}|q\\d{2}|\\d{4}", input))
year = gsub("q","",year)
year = sub("\\b(\\d{2})\\b","20\\1", year)

Существует также много проблем с сопоставлением года, потому что у вас есть три различных возможных формата "q09"," Q2008 "," 2008 ".Поскольку функция возвращает первое совпадение в строке, q \ d {4} требуется для возврата примера q2008.

Моя функция sub здесь, которая соответствует регулярному выражению с 20 и самому соответствующему выражению, \\1 возвращает содержимое в скобках (\\d{2})

Проверьте это и прокомментируйте все ошибки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...