Разделение столбца с использованием отдельного (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).
То, что я пытаюсь сделать, сводится к:
- Идентификация первой цифры в строке
- Разделение на эту хартию. На самом деле, я был бы счастлив сохранить этот особый характер.
Ответы
Ответ 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) может быть сопоставлено