Подтвердить что ты не робот

Разделение столбца с использованием отдельного (tidyr) через dplyr на первой встреченной цифре

Я пытаюсь разделить довольно беспорядочный столбец на два столбца, содержащие период и описание. Мои данные похожи на выдержку ниже:

set.seed(1)
dta <- data.frame(indicator=c("someindicator2001", "someindicator2011",
                              "some text 20022008", "another indicator 2003"),
                  values = runif(n = 4))

Желаемые результаты

Желаемые результаты должны выглядеть так:

          indicator   period    values
1     someindicator     2001 0.2655087
2     someindicator     2011 0.3721239
3         some text 20022008 0.5728534
4 another indicator     2003 0.9082078

Характеристики

  • Описание индикаторов находится в одном столбце
  • Числовые значения (отсчет от первой цифры с первой цифрой находятся во втором столбце)

Код

require(dplyr); require(tidyr); require(magrittr)
dta %<>%
  separate(col = indicator, into = c("indicator", "period"),
           sep = "^[^\\d]*(2+)", remove = TRUE)

Естественно, это не работает:

> head(dta, 2)
  indicator period    values
1              001 0.2655087
2              011 0.3721239

Другие попытки

  • Я также попробовал метод разделения по умолчанию sep = "[^[:alnum:]]", но он разбивает столбец на слишком много столбцов, поскольку он, похоже, соответствует всем доступным цифрам.
  • sep = "2*" также не работает, так как время от времени слишком много 2 (пример: 2 003 2 006).

То, что я пытаюсь сделать, сводится к:

  • Идентификация первой цифры в строке
  • Разделение на эту хартию. На самом деле, я был бы счастлив сохранить этот особый характер.
4b9b3361

Ответ 1

Я думаю, это может сделать это.

library(tidyr)
separate(dta, indicator, c("indicator", "period"), "(?<=[a-z]) ?(?=[0-9])")
#           indicator   period    values
# 1     someindicator     2001 0.2655087
# 2     someindicator     2011 0.3721239
# 3         some text 20022008 0.5728534
# 4 another indicator     2003 0.9082078

Ниже приведено объяснение регулярного выражения, представленного regex101.

  • (?<=[a-z]) - положительный lookbehind - он утверждает, что [a-z] (совпадение с одним символом, присутствующим в диапазоне между a и z (чувствительным к регистру)) может быть сопоставлено
  • ? соответствует символу пробела перед ним буквально, между нулем и одним раз, как можно много раз, при необходимости возвращаясь
  • (?=[0-9]) - положительный результат - он утверждает, что [0-9] (совпадение с одним символом в диапазоне от 0 до 9) может быть сопоставлено