【问题标题】:Find replace all using dictionary of regex patterns in R (perhaps tidyverse)?使用R中的正则表达式模式字典查找全部替换(也许是tidyverse)?
【发布时间】:2018-09-06 23:46:27
【问题描述】:

我想从一组模式替换为特定的字符串。例如,这些可能是各种缩写月份名称转换为月份的数值。我创建了一个字典如下(波兰月份字符串 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 中是否有可以解决问题的功能或解决方案?到目前为止,我尝试了 library(DataCombine) 但它不起作用,没有将我的列视为文本,可能存在错误。

【问题讨论】:

  • 你可以使用stringr::str_replace_all,例如查看this answer

标签: r regex dplyr tidyverse stringr


【解决方案1】:

我认为在这种情况下,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
}

【讨论】:

  • 谢谢。它也有效。谢谢你的帮助。但它似乎只找到第一次出现,然后将其余出现单独留在字符串中。
  • 我把seq_len(dictionary)打错了,应该是seq_len(nrow(dictionary))。现在应该可以按预期工作了。
  • 我无法标记两个答案。这应该是可能的!非常感谢!
【解决方案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 与 8 月匹配。因此,您将需要利用您对这些月份名称出现的了解来改进字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多