首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

读外文
EN

Stack Overflow用户
提问于 2014-04-18 11:07:35
回答 2查看 756关注 0票数 6

我有一个数据库,里面有我在R (3.02)中读到的英超足球运动员的名字,但是当涉及到名字中有外国字符的球员时,我遇到了一些困难。下面的代码说明了这一点:

代码语言:javascript
运行
复制
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:替换字符串中的外来字符,但是由于我的示例中的重音字符似乎被读取为两个单独的字符,所以我认为它不起作用。

如有任何建议或解决办法,我将不胜感激。

该文件可供下载这里

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-18 11:27:27

编辑:您提供的文件似乎使用了与您系统的本机编码不同的编码。

stri_enc_detect函数从斯蒂包完成的(实验性)编码检测提供:

代码语言:javascript
运行
复制
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在读取该文件时不必重新编码输入--它可能设置的编码标记与默认(==本机)不同。您可以使用以下内容加载该文件:

代码语言:javascript
运行
复制
PlayerData<-read.table('~/Desktop/PLAYERS.csv',
    quote=NULL, dec = ".", sep=",", 
    stringsAsFactors=FALSE, header=TRUE, fill=TRUE,
    blank.lines.skip=TRUE, encoding='latin1')

现在您可以正确地访问单个字符,例如使用stri_sub函数:

代码语言:javascript
运行
复制
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"

根据比较字符串,下面是字符串相等性测试的结果,重音字符“扁平”:

代码语言:javascript
运行
复制
stri_cmp_eq("Özil", "Ozil", stri_opts_collator(strength=1))
## [1] TRUE

您也可以通过使用iconv的音译器来消除重音字符(不过,我不确定它在Windows上是否可用)。

代码语言:javascript
运行
复制
iconv(Test$Player, 'latin1', 'ASCII//TRANSLIT')
## [1] "Cazorla" "Ozil"

或者使用来自斯蒂包的非常强大的音译器( >= 0.2-2版):

代码语言:javascript
运行
复制
stri_trans_general(Test$Player, 'Latin-ASCII')
## [1] "Cazorla" "Ozil"
票数 4
EN

Stack Overflow用户

发布于 2014-04-18 20:42:55

谢谢你们的帮助。

字符串已正确编码为UTF-8 (我向read.table添加了参数,并按照建议使用了iconv )。这似乎不是问题所在。

我还使用了stri_sub()函数。但这似乎也不起作用(它还将重音作为一个单独的字符stri_sub("Özil",1,3) = "Ã<U+0096>z")。

不过,谢谢您为我指明了如何编写stringi文档,它给了我一个解决方法的想法,我很乐意使用这个方法:

代码语言:javascript
运行
复制
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等)。希望不要花太长时间!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23152861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档