从R中的数据框列中删除重音

han*_*ick 9 r diacritics

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

class(base$term)
[1] character
length(base$term)
[1] 27486
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有谁知道这里发生了什么?

han*_*ick 16

好的解决问题的方法:

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

感谢@nicola


小智 14

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

\n
library(stringi)\n\nbase <- data.frame(terme = c("Mill\xc3\xa9sime", \n                             "boulang\xc3\xa8re", \n                             "\xc3\xbc\xc3\xa9\xc3\xa2\xc3\xa4\xc3\xa0\xc3\xa5\xc3\xa7\xc3\xaa\xc3\xab\xc3\xa8\xc3\xaf\xc3\xae\xc3\xac"))\n\nbase$terme = stri_trans_general(str = base$terme, id = "Latin-ASCII")\n
Run Code Online (Sandbox Code Playgroud)\n


Jel*_*rik 6

使用包可能会更容易。这样,您无需事先检查编码。此外,在操作系统是一致的,不是一致的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
Run Code Online (Sandbox Code Playgroud)