我有一个数据库,其中包含我正在阅读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
我已尝试更换字符,如下所述:R: Replacing foreign characters in a string,但由于我示例中的重音字符似乎被视为两个单独的字符,我认为它不起作用。
如果有任何建议或解决方法,我将不胜感激。
该文件可供下载here。
答案 0 :(得分:3)
编辑:您提供的文件似乎使用的编码与系统原生文件不同。
来自stringi包的stri_enc_detect
函数执行的(实验性)编码检测得出:
library('stringi')
PlayerDataRaw <- stri_read_raw('~/Desktop/PLAYERS.csv')
stri_enc_detect(PlayerDataRaw)
## [[1]]
## [[1]]$Encoding
## [1] "ISO-8859-1" "ISO-8859-2" "ISO-8859-9" "IBM424_rtl"
##
## [[1]]$Language
## [1] "en" "ro" "tr" "he"
##
## [[1]]$Confidence
## [1] 0.25 0.14 0.09 0.02
因此,该文件最有可能位于ISO-8859-1
a.k.a。latin1
。幸运的是,R在读取此文件时不必重新编码输入 - 它可能只设置一个不同于默认(== native)编码标记。您可以使用以下命令加载文件:
PlayerData<-read.table('~/Desktop/PLAYERS.csv',
quote=NULL, dec = ".", sep=",",
stringsAsFactors=FALSE, header=TRUE, fill=TRUE,
blank.lines.skip=TRUE, encoding='latin1')
现在您可以正确访问各个字符,例如使用stri_sub
函数:
Test<-PlayerData[c(33655:33656),]
Test
## T Away H.A Home Player Year
## 33655 33654 CrystalPalace 1 Arsenal Cazorla 2013
## 33656 33655 CrystalPalace 1 Arsenal Özil 2013
stri_sub(Test$Player, 1, length=1)
## [1] "C" "Ö"
stri_sub(Test$Player, 2, length=1)
## [1] "a" "z"
根据比较字符串,以下是字符串相等测试的结果,带有重音字符&#34;展平&#34;:
stri_cmp_eq("Özil", "Ozil", stri_opts_collator(strength=1))
## [1] TRUE
您也可以使用iconv
的音译来消除重音字符(但我不确定它是否在Windows上可用)。
iconv(Test$Player, 'latin1', 'ASCII//TRANSLIT')
## [1] "Cazorla" "Ozil"
或者使用stringi包中非常强大的音译器(stringi version&gt; = 0.2-2):
stri_trans_general(Test$Player, 'Latin-ASCII')
## [1] "Cazorla" "Ozil"
答案 1 :(得分:0)
谢谢大家对此的帮助。
字符串已正确编码为UTF-8(我将参数添加到read.table
以及使用iconv
,如建议的那样)。这似乎不是问题。
我还使用了stri_sub()
功能。但这似乎也没有用(它还将重音视为一个单独的角色stri_sub("Özil",1,3) = "Ã<U+0096>z"
)。
但是,感谢您指点我的stringi文档的方向,它给了我一个解决方法的想法,我很乐意使用:
remove.accents<-function(s){
oldrefs<-c(214,225)#Ö, á
newrefs<-c(79,97)#O,a
New<-utf8ToInt(s)
for(i in 1:length(oldrefs)){
New<-as.numeric(gsub(oldrefs[i],newrefs[i],New))
NEW<-intToUtf8(New)
}
NEW
}
> (remove.accents("Özil"))
[1] "Ozil"
> (remove.accents("Suárez"))
[1] "Suarez"
我现在可以使用Int引用填充oldrefs / newref数组,以获取某些玩家需要的其他角色(TouréJääskeläinen,Agüero等),希望这些角色不需要太长时间!