Найти заменить все, используя словарь шаблонов регулярных выражений в R (возможно, Tidyverse)?
Я хотел бы заменить из набора шаблонов для конкретной строки. Например, это могут быть различные сокращенные названия месяцев в числовом значении месяца. Я создал словарь следующим образом (польские месяцы, строки 2, числовое значение.
dictionary<-data.frame(
from=c("(S|s)tycz(eń|nia)|(S|s)t(y|ycz)",
"(L|l)ut(y|ego)|(L|l)u(t)",
"(M|m)ar(ca|zec)|(M|m)ar",
"(K|k)wie(tnia|cień)|(K|k)wi(|e)",
"(M|m)aj(a|)",
"(C|c)zerw(ca|iec)|(C|c)e(|r|rw)",
"(L|l)ip(ca|iec)|(L|l)i(|p|c)",
"(S|s)ierp(nia|ień)|(S|s)i(|e|er|erp)",
"(W|w)rze(śnia|sień)|(W|w)rz(|e)",
"(P|p)aździernik(a|)|(P|p)a(ź|źd|źdź)",
"(L|l)istopad(a|)|(L|l)is(|t|to|top)",
"(G|g)rud(nia|zień)|(G|g)ru(|d)"
),
to=c(" 01 "," 02 "," 03 "," 04 "," 05 "," 06 "," 07 "," 08 "," 09 "," 10 "," 11 "," 12 ")
)
Я хотел бы использовать его в длинном столбце грязных описательных строк, из которых позже я хотел бы извлечь даты.
Это будет как:
Badanie zakończy się 28Wrze2018
или же
Zakończenie badania 28 Września 2018 najpóźniej...
И так далее для тысяч записей
Я хотел бы получить
Badanie zakończy się 28 09 2018
Есть ли функция или решение в Tidyverse, который бы сработал? До сих пор я пробовал библиотеку (DataCombine), но она не работает, не видит мой столбец в виде текста, возможно, есть ошибка.
Заранее спасибо за все направления.
2 ответа
С помощью stringr
это было бы
dictionary <- setNames(
c(" 01 "," 02 "," 03 "," 04 "," 05 "," 06 "," 07 "," 08 "," 09 "," 10 "," 11 "," 12 "),
c("(S|s)tycz(eń|nia)|(S|s)t(y|ycz)",
"(L|l)ut(y|ego)|(L|l)u(t)",
"(M|m)ar(ca|zec)|(M|m)ar",
"(K|k)wie(tnia|cień)|(K|k)wi(|e)",
"(M|m)aj(a|)",
"(C|c)zerw(ca|iec)|(C|c)e(|r|rw)",
"(L|l)ip(ca|iec)|(L|l)i(|p|c)",
"(S|s)ierp(nia|ień)|(S|s)i(|e|er|erp)",
"(W|w)rze(śnia|sień)|(W|w)rz(|e)",
"(P|p)aździernik(a|)|(P|p)a(ź|źd|źdź)",
"(L|l)istopad(a|)|(L|l)is(|t|to|top)",
"(G|g)rud(nia|zień)|(G|g)ru(|d)"
)
)
str_replace_all(string, dictionary)
Однако учтите, что пока
str_replace_all("Zakończenie badania 28 Września 2018 najpóźniej...", dictionary)
# [1] "Zakończenie badania 28 09 2018 najpóźniej..."
работает как положено, получаем
str_replace_all("Badanie zakończy się 28Wrze2018 ", dictionary)
# [1] "Badanie zakończy 08 ę 28 09 e2018 "
так как si
подходит для августа. Следовательно, вам нужно будет улучшить словарь, используя ваши знания о появлении этих названий месяцев.
Я думаю, что это ситуация, когда вас лучше всего обслуживает for
петля.
convert_date <- function(x){
dictionary<-data.frame(
from=c("(S|s)tycz(eń|nia)|(S|s)t(y|ycz)",
"(L|l)ut(y|ego)|(L|l)u(t)",
"(M|m)ar(ca|zec)|(M|m)ar",
"(K|k)wie(tnia|cień)|(K|k)wi(|e)",
"(M|m)aj(a|)",
"(C|c)zerw(ca|iec)|(C|c)e(|r|rw)",
"(L|l)ip(ca|iec)|(L|l)i(|p|c)",
"(S|s)ierp(nia|ień)|(S|s)i(|e|er|erp)",
"(W|w)rze(śnia|sień)|(W|w)rz(|e)",
"(P|p)aździernik(a|)|(P|p)a(ź|źd|źdź)",
"(L|l)istopad(a|)|(L|l)is(|t|to|top)",
"(G|g)rud(nia|zień)|(G|g)ru(|d)"
),
to=c(" 01 "," 02 "," 03 "," 04 "," 05 "," 06 "," 07 "," 08 "," 09 "," 10 "," 11 "," 12 "),
stringsAsFactors = FALSE
)
for (i in seq_len(nrow(dictionary))){
x <- gsub(dictionary$from[i],
dictionary$to[i],
x)
}
x
}