谈谈R中的乱码(三)

浏览: 1643

数据匠(baidao.net):http://www.baidao.net/

往期回顾

谈谈R中的乱码(一)

谈谈R中的乱码(二)


前面讲过,R 中字符向量可以有多种编码。一般情况下,对于混合编码,R 都能很好的自动处理。例如:


x1 <- '中国'
x2 <- iconv(x1, 'GB2312', 'UTF-8')
## == 判断也没问题
x2 == '中国'
## [1] TRUE

x <- c(x1, x2)
grep('中', x)
## [1] 1 2
grep(iconv('中', 'GB2312', 'UTF-8'), x)
## [1] 1 2


在写命令时,无需特意为了目标字符将匹配条件转为相应的编码,R 自动就在后台做了转换。然而,总有些让人意想不到的角落,例如:


a1 <- iconv('中文 aa', 'gb2312', 'UTF-8')
Encoding(a1)
## [1] "UTF-8"

# 当待替换字符非 UTF-8 编码,替换字符为 UTF-8 编码,结果乱码
(r1 <- sub('aa', a1, 'aa ba'))
## [1] "涓枃 aa ba"
Encoding(r1)
## [1] "unknown"
# 需要手工纠正
Encoding(r1) <- 'UTF-8'
r1
## [1] "中文 aa ba"

(r2 <- sub('aa', a1, 'aa ba', useBytes = F, fixed = T))
## [1] "涓枃 aa ba"
Encoding(r2)
## [1] "unknown"
Encoding(r2) <- 'UTF-8'
r2
## [1] "中文 aa ba"


在线帮助里是这么写的:

Clipboard Image.png

这是少数几处帮助文本与实际情况脱离的个例。

待替换字符为 UTF-8 编码,倒是没有问题:


sub('aa', 'bb', a1, fixed = F)
## [1] "中文 bb"


如果是我们自己写的代码,可以小心谨慎,避免跳坑,很容易就能找到替代方案。博主随便列举一下,就有两种:

方式一:坚持极简主义不用第三方包,使用正则表达式之动力引擎 regexpr() 进行替换


s <- 'aa ba'
m <- regexpr('aa', s)
regmatches(s, m) <- a1
s
## [1] "中文 aa ba"


方式二:用包也不羞耻之 stringr 包


library(stringr)
str_replace('aa', 'aa', a1)
## [1] "中文 aa"
str_replace(a1, 'aa', '+')
## [1] "中文 +"


但是 sub() 和 gsub() 作为R的基础函数,在大量的包中广泛存在,怎么避免让这些包跳坑呢?

本来还想介绍一个与混合编码有关的奇葩案例(来自性能无敌的 data.table 包),但是实在太奇葩了,所以今天就提前收尾吧。

替第四篇做个预告。用过 tm 包的童鞋想必经常碰到为什么 tm 包里词都连起来了? 这样的问题。问题就出在 scan() 这个基础函数(怎么又是基础函数!)。scan() 是R中用来拆分文本的函数,读取文本数据(read.table())都要用。我记得以前是正常的,但不记得是哪个R版本升级之后,就变成下面这样了,“的”和“分词”被当作了同一个词。scan()的这个奇葩结果就是中文文本分了词让 tm 建矩阵结果还是分的乱七八糟的原因。


x = '测试 中文 的 分词'
scan(text = x, what='', sep=' ')
## [1] "测试"    "中文"    "的 分词"


 往期精彩内容整理合集 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)

Clipboard Image.png

公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册