Поиск определенного строкового шаблона - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу иметь возможность искать определенную строку в следующем формате:

"q4-2015"
"q2-2013"
"q3-2011"

из длинного списка имен файлов и разбивать их на две переменные: квартал и год.

так, например, длинный список имен может включать в себя:

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

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

year = 2015, quarter = q4

и во втором случае:

year = 2012, quarter = q2

и т. Д.

Ответы [ 3 ]

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

Мы можем попробовать с этим шаблоном

captured_words <- sub(".*\\b(q\\d)-(\\d+)\\b.*", "\\1-\\2", x)
captured_words
#[1] "q4-2015" "q2-2012"

Здесь мы фиксируем два термина:

1) q, за которым следует однозначное число и 2) числа, следующие за ним.

Мы можем разделить их и прочитать их в кадре данных, используя read.table

read.table(text = paste0(captured_words, collapse = "\n"), sep = "-")

#  V1   V2
#1 q4 2015
#2 q2 2012

данные

x <- c("aaaaa-ttttt-eeee-q4-2015-file","aaaaaa-fffff-3333-q2-2012-file")
0 голосов
/ 06 февраля 2019

1) strcapture Использование тестового входа, воспроизводимого в примечании в конце, может вызвать strcapture из базы R:

pat <- "(q\\d)-(\\d{4})"
strcapture(pat, x, list(quarter = "", year = 0))

, давая:

  quarter year
1      q4 2015
2      q2 2012

Альтернативой может быть столбец с числовым кварталом.В этом случае мы будем использовать pat <- "(\\d)-(\\d{4})" и list(quarter = 0, year = 0).

2) read.pattern read.pattern в пакете gsubfn можно использовать с тем же шаблоном.

library(gsubfn)

read.pattern(text = x, pattern = pat, col.names = c("quarter", "year"),
  as.is = TRUE)

, что дает:

  quarter year
1      q4 2015
2      q2 2012

2a) Другой подход заключается в использовании strapply в gsubfn для создания объекта класса yearqtr, а затем мы можем легко извлечь квартал и год или просто оставить его как объект yearmon:

library(gsubfn)
library(zoo)

ym  <- do.call("c", 
  strapply(x, pat, q + y ~ as.yearqtr(paste(y, q, sep = "-"))))

ym
## [1] "2015 Q4" "2012 Q2"

data.frame(quarter = paste0("q", cycle(ym), year = as.integer(ym),
  stringsAsFactors = FALSE)
##   quarter year
## 1      q4 2015
## 2      q2 2012

Примечание

# test input
x <- c("aaaaa-ttttt-eeee-q4-2015-file",
  "aaaaaa-fffff-3333-q2-2012-file")
0 голосов
/ 06 февраля 2019

Мы можем попробовать использовать sub здесь:

quarters <- sapply(input, function(x) {
    sub(".*\\b(q\\d+)-\\d{4}\\b.*", "\\1", x)
})

years <- sapply(input, function(x) {
    sub(".*\\bq\\d+-(\\d{4})\\b.*", "\\1", x)
})

df <- data.frame(quarters, years)
df

        quarters years
q4-2015       q4  2015
q2-2013       q2  2013
q3-2011       q3  2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...