Pas*_*101 6 string encoding r character-encoding string-comparison
我有一个数据库,其中包含我正在阅读R(3.02)的英超足球运动员的名字,但是当涉及到名字中包含外国角色的球员(变音符号,口音等)时遇到了困难.下面的代码说明了这一点:
PlayerData<-read.table("C:\\Users\\Documents\\Players.csv",quote=NULL, dec = ".",,sep=",", stringsAsFactors=F,header=T,fill=T,blank.lines.skip = TRUE)
Test<-PlayerData[c(33655:33656),] #names of the players here are "Cazorla" "Özil"
Test[Test$Player=="Cazorla",] #Outputs correct details
Test[Test$Player=="Ozil",] # Can not find data '0 rows> (or 0-length row.names)'
<
#Example of how the foreign character is treated:
substr("Özil",1,1)
[1] "Ã"
substr("Özil",1,2)
[1] "Ö"
substr("Özil",2,2)
[1] "
substr("Özil",2,3)
[1] "z
Run Code Online (Sandbox Code Playgroud)
我已经尝试更换字符,如下所述:R:替换字符串中的外来字符,但由于我的示例中的重音字符似乎被读作两个单独的字符,我认为它不起作用.
我会很感激任何建议或解决方法.
该文件可在此处下载.
编辑:您提供的文件似乎使用了与系统本机不同的编码。
\n\n由stringistri_enc_detect包中的函数完成的(实验性)编码检测给出:
library(\'stringi\')\nPlayerDataRaw <- stri_read_raw(\'~/Desktop/PLAYERS.csv\')\nstri_enc_detect(PlayerDataRaw)\n## [[1]]\n## [[1]]$Encoding\n## [1] "ISO-8859-1" "ISO-8859-2" "ISO-8859-9" "IBM424_rtl"\n## \n## [[1]]$Language\n## [1] "en" "ro" "tr" "he"\n## \n## [[1]]$Confidence\n## [1] 0.25 0.14 0.09 0.02\nRun Code Online (Sandbox Code Playgroud)\n\n所以该文件很可能位于ISO-8859-1aka中latin1。幸运的是,R 在读取此文件时不必重新编码输入 - 它可能只是设置与默认(==本机)编码标记不同的编码标记。您可以使用以下命令加载文件:
PlayerData<-read.table(\'~/Desktop/PLAYERS.csv\',\n quote=NULL, dec = ".", sep=",", \n stringsAsFactors=FALSE, header=TRUE, fill=TRUE,\n blank.lines.skip=TRUE, encoding=\'latin1\')\nRun Code Online (Sandbox Code Playgroud)\n\n现在您可以正确访问单个字符,例如使用以下stri_sub函数:
Test<-PlayerData[c(33655:33656),]\nTest\n## T Away H.A Home Player Year\n## 33655 33654 CrystalPalace 1 Arsenal Cazorla 2013\n## 33656 33655 CrystalPalace 1 Arsenal \xc3\x96zil 2013\n\nstri_sub(Test$Player, 1, length=1)\n## [1] "C" "\xc3\x96"\nstri_sub(Test$Player, 2, length=1)\n## [1] "a" "z"\nRun Code Online (Sandbox Code Playgroud)\n\n根据比较字符串,以下是字符串相等性测试的结果,其中重音字符“扁平化”:
\n\nstri_cmp_eq("\xc3\x96zil", "Ozil", stri_opts_collator(strength=1))\n## [1] TRUE\nRun Code Online (Sandbox Code Playgroud)\n\n您还可以使用 \ 的音译器去除重音字符iconv(不过我不确定它是否在 Windows 上可用)。
iconv(Test$Player, \'latin1\', \'ASCII//TRANSLIT\')\n## [1] "Cazorla" "Ozil"\nRun Code Online (Sandbox Code Playgroud)\n\n或者使用stringi包中非常强大的音译器(stringi 版本 >= 0.2-2):
\n\nstri_trans_general(Test$Player, \'Latin-ASCII\')\n## [1] "Cazorla" "Ozil"\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |