【问题标题】:Remove accents from a dataframe column in R从 R 中的数据框列中删除重音符号
【发布时间】:2017-01-02 02:11:19
【问题描述】:

我有一个 data.table 基础。 我在这个 data.table 中有一个术语列

class(base$term)
[1] character
length(base$term)
[1] 27486

我能够从字符串中删除重音符号。 我可以从字符串向量中删除重音符号。

iconv("Millésime",to="ASCII//TRANSLIT")
[1] "Millesime"
iconv(c("Millésime","boulangère"),to="ASCII//TRANSLIT")
[1] "Millesime" "boulangere"

但由于某种原因,当我在术语列上应用完全相同的功能时它不起作用

base$terme[2]
[1] "Millésime"
iconv(base$terme[2],to="ASCII//TRANSLIT")
[1] "MillACsime"

有人知道这里发生了什么吗?

【问题讨论】:

  • 是因为base$terme 是一个因素吗?尝试先转换为character 还是转换级别?
  • @NJBurgo 根据第一个输出(假设有错字),它的类型是character
  • 小心:我的向量得到了完全不同的结果:[1] "Mill'esime" "boulang`ere" iconv 文档指定 TRANSLIT 在不同的系统上给出不同的结果(这当然有点没用)。
  • 试试iconv(base$terme[2],from="latin1",to="ASCII//TRANSLIT")。如果不行,请给出Encoding(base$terme[2])的输出。
  • 嗨 Nicola,Encoding(base$terme[2]) 的输出是“UTF-8”

标签: r diacritics


【解决方案1】:

好的解决问题的方法:

Encoding(base$terme[2])
[1] "UTF-8"
iconv(base$terme[2],from="UTF-8",to="ASCII//TRANSLIT")
[1] "Millesime"

感谢@nicola

【讨论】:

    【解决方案2】:

    使用 包可能更容易。这样,您无需事先检查编码。此外, 在操作系统之间是一致的,而inconv 则不是。

    library(stringi)
    
    base <- data.table(terme = c("Millésime", 
                                 "boulangère", 
                                 "üéâäàåçêëèïîì"))
    
    base[, terme := stri_trans_general(str = terme, 
                                       id = "Latin-ASCII")]
    
    > base
               terme
    1:     Millesime
    2:    boulangere
    3: ueaaaaceeeiii
    

    【讨论】:

    • 这是唯一对我有用的方法,非常感谢!
    【解决方案3】:

    你可以应用这个功能

        rm_accent <- function(str,pattern="all") {
       if(!is.character(str))
        str <- as.character(str)
    
      pattern <- unique(pattern)
    
      if(any(pattern=="Ç"))
        pattern[pattern=="Ç"] <- "ç"
    
      symbols <- c(
        acute = "áéíóúÁÉÍÓÚýÝ",
        grave = "àèìòùÀÈÌÒÙ",
        circunflex = "âêîôûÂÊÎÔÛ",
        tilde = "ãõÃÕñÑ",
        umlaut = "äëïöüÄËÏÖÜÿ",
        cedil = "çÇ"
      )
    
      nudeSymbols <- c(
        acute = "aeiouAEIOUyY",
        grave = "aeiouAEIOU",
        circunflex = "aeiouAEIOU",
        tilde = "aoAOnN",
        umlaut = "aeiouAEIOUy",
        cedil = "cC"
      )
    
      accentTypes <- c("´","`","^","~","¨","ç")
    
      if(any(c("all","al","a","todos","t","to","tod","todo")%in%pattern)) # opcao retirar todos
        return(chartr(paste(symbols, collapse=""), paste(nudeSymbols, collapse=""), str))
    
      for(i in which(accentTypes%in%pattern))
        str <- chartr(symbols[i],nudeSymbols[i], str) 
    
      return(str)
    }
    

    【讨论】:

    • iconv 不同,这不是矢量化的,也没有涵盖所有可能性。
    【解决方案4】:

    这是 Jeldrik 针对 DataFrames 修改的解决方案的一个版本。请注意,:= 运算符在基础 R 中已弃用。

    library(stringi)
    
    base <- data.frame(terme = c("Millésime", 
                                 "boulangère", 
                                 "üéâäàåçêëèïîì"))
    
    base$terme = stri_trans_general(str = base$terme, id = "Latin-ASCII")
    

    【讨论】:

      【解决方案5】:

      消除重音的三种方法 - 下面显示并相互比较。
      要玩的数据:

      dtCases <- fread("https://raw.githubusercontent.com/ccodwg/Covid19Canada/master/retired_datasets/individual_level/cases_2021_1.csv", stringsAsFactors = F )
      dim(dtCases) #  751526     16
      

      基准测试:

      > system.time(dtCases [, city0 := health_region])
         user  system elapsed 
        0.009   0.001   0.012 
      > system.time(dtCases [, city1 := base::iconv (health_region, to="ASCII//TRANSLIT")]) # or ... iconv (health_region, from="UTF-8", to="ASCII//TRANSLIT")
         user  system elapsed 
        0.165   0.001   0.200 
      > system.time(dtCases [, city2 := textclean::replace_non_ascii (health_region)])
         user  system elapsed 
        9.108   0.063   9.351 
      > system.time(dtCases [, city3 := stringi::stri_trans_general (health_region,id = "Latin-ASCII")])
         user  system elapsed 
         4.34    0.00    4.46 
      

      结果:

      > dtCases[city0!=city1, city0:city3] %>% unique
                                 city0                         city1                         city2                         city3
                                <char>                        <char>                        <char>                        <char>
      1:                      Montréal                      Montreal                      Montreal                      Montreal
      2:                    Montérégie                    Monteregie                    Monteregie                    Monteregie
      3:          Chaudière-Appalaches          Chaudiere-Appalaches          Chaudiere-Appalaches          Chaudiere-Appalaches
      4:                    Lanaudière                    Lanaudiere                    Lanaudiere                    Lanaudiere
      5:                Nord-du-Québec                Nord-du-Quebec                Nord-du-Quebec                Nord-du-Quebec
      6:         Abitibi-Témiscamingue         Abitibi-Temiscamingue         Abitibi-Temiscamingue         Abitibi-Temiscamingue
      7: Gaspésie-Îles-de-la-Madeleine Gaspesie-Iles-de-la-Madeleine Gaspesie-Iles-de-la-Madeleine Gaspesie-Iles-de-la-Madeleine
      8:                     Côte-Nord                     Cote-Nord                     Cote-Nord                     Cote-Nord
      

      结论:

      base::iconv() 是最快和首选的方法。 测试法语单词。未在其他语言上测试。

      【讨论】:

        猜你喜欢
        • 2014-12-11
        • 2016-10-21
        • 2012-01-21
        • 1970-01-01
        • 2019-11-19
        • 2022-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多