【问题标题】:Concatenate gsub [duplicate]连接 gsub [重复]
【发布时间】:2013-12-21 11:10:46
【问题描述】:

我目前正在运行以下代码来清除重音字符中的数据:

df <- gsub('Á|Ã', 'A', df)
df <- gsub('É|Ê', 'E', df)
df <- gsub('Í',   'I', df)
df <- gsub('Ó|Õ', 'O', df)
df <- gsub('Ú',   'U', df)
df <- gsub('Ç',   'C', df)

但是,我想只用一行来完成(使用另一个函数就可以了)。我该怎么做?

【问题讨论】:

  • 真正的方法不涉及正则表达式,而是 Unicode 规范化。但是,我不确定 R 中支持的 Unicode 库绑定(例如 ICU)有多好,因此正确的解决方案在实践中的可行性如何。

标签: regex r optimization gsub


【解决方案1】:

一个选项可以是chartr

> toreplace <- LETTERS
> replacewith <- letters
> (somestring <- paste(sample(LETTERS,10),collapse=""))
[1] "MUXJVYNZQH"
> 
> chartr(
+   old=paste(toreplace,collapse=""),
+   new=paste(replacewith,collapse=""),
+   x=somestring
+   )
[1] "muxjvynzqh"

【讨论】:

    【解决方案2】:

    试试这样的

    iconv(c('Á'), "utf8", "ASCII//TRANSLIT")
    

    您可以向c() 添加更多元素。

    编辑:它取决于机器,检查help(iconv)

    这里是R 解决方案

    mychar <- c('ÁÃÉÊÍÓÕÚÇ')
    iconv(mychar, "latin1", "ASCII//TRANSLIT") # one line, as requested
    [1] "AAEEIOOUC"
    

    【讨论】:

    • 这会为我返回NA
    • 应该这样做mychar &lt;- c('Á', 'Ã', 'É', 'Ê', 'Í', 'Ó', 'Õ', 'Ú','Ç')iconv(mychar, "latin1", "ASCII//TRANSLIT")
    • 是的,在 Windows 上,您应该使用“ISO-8859-1”之类的东西,而不是“utf8”。
    • 这是一个有趣的解决方案,但它似乎只适用于单个向量。我实际上必须读取一个包含 900 个条目的名称向量,而且我不能将整个向量推入 iconv
    • @WaldirLeoncio 当然可以:Vectorize(iconv)(rep(mychar, 2), "latin1", "ASCII//TRANSLIT")
    【解决方案3】:
    df = as.data.frame(apply(df,2,function(x) gsub('Á|Ã', 'A', df)))
    

    2 表示列,1 表示行

    【讨论】:

    • 这适用于一个“A”替换,但其余的呢?我的观点是:如果不运行相同的命令六次,我怎么能做到这一点?
    • 请看上面agstudy的回答,效果很好
    【解决方案4】:

    这是一个编码问题,通常您通过指示正确的编码来解决它。如果还想用正则表达式来做,可以用gsubfn写一个划线解决方案:

    library(gsubfn)
    ll <- list('Á'='A', 'Ã'='A', 'É'='E',
               'Ê'='E', 'Í'='I', 'Ó'='O',
               'Õ'='O', 'Ú'='U', 'Ç'='C')
    gsubfn('Á|Ã|É|Ê|Í|Ó|Õ|Ú|Ç',ll,'ÁÃÉÊÍÓÕÚÇ')
    [1] "AAEEIOOUC"
    gsubfn('Á|Ã|É|Ê|Í|Ó|Õ|Ú|Ç',ll,c('ÁÃÉÊÍÓÕÚÇ','ÍÓÕÚÇ'))
    [1] "AAEEIOOUC" "IOOUC"   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 2018-12-11
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多