R语言包和中文乱码解决方案
常用R语言包
——数据处理:lubridata ,plyr ,reshape2,stringr,formatR,mcmc;
——机器学习:nnet,rpart,tree,party,lars,boost,e1071,BayesTree,gafit,arules;
——可视化包:ggplot2,lattice,googleVis;
——地图包:ggmap,RgoogleMaps,rworldmap;
金融包
——时间序列:zoo,xts,chorn,its,timeDate;
——金融分析:quantmod,RQuantLib,portfolio,PerformanceAnalytics,TTR,sde,YieldCurve;
——风险管理:parma,evd,evdbayes,evir,extRemes,ismev;
数据挖掘包
——聚类:
——基于划分的方法: kmeans, pam, pamk, clara ;
——基于层次的方法: hclust, pvclust, agnes, diana
——基于模型的方法: mclust
——基于密度的方法: dbscan
——基于画图的方法: plotcluster, plot.hclust
——基于验证的方法: cluster.stats
——文本挖掘:tm
——分类:
——策树: rpart, ctree
——随机森林: cforest, randomForest
——回归, Logistic, Poisson,glm, predict, residuals
——生存分析: survfit, survdiff, coxph
——统计
——常用的包: Base R, nlme
——方差分析: aov, anova
——密度分析: density
——假设检验: t.test, prop.test, anova, aov
——线性混合模型:lme
——主成分分析和因子分析:princomp
——优化
——最简单的:stat包中的optimize, optim 函数
——非线性优化:BB包
——线性不等式约束的非线性优化:constrOptim,adaptive barrier 算法
——非线性box约束优化:nlminb
——带约束的非线性优化:Rsolnp包中solnp函数,alabama包中的constrOptim.nl()函数
——线性规划:lpSolve 包 中的lp函数,linprog包中的 solveLP函数
——中文分词包
——Rwordseq 中文分词包
中文编码
中文乱码是让很多编程者头痛的问题。
什么是编码?
文字符号在计算机中是用 0 和 1 的字节序列表示的,编码就是将字节序列与所要表示的文字符号建立起映射。要把各个国家不同的所有文字符号(字符集)正常显示和使用,需要做两件事情:各个国家不同的所有文字符号一一对应地建立数字编码;数字编码按一定编码规则用 0-1 表示出来。第一件事情已有一种 Unicode 编码(万国码)来解决:它给全世界所有语言的所有文字符号规定了独一无二的数字编码,字符间分隔的方式是用固定长度字节数。这样各个国家只需要做第二件事情:为自己国家的所有文字符号设计一种编码规则来表示对应的 Unicode 编码。
——汉字符号编码
再来说中国的第二件事情:汉字符号(中文)编码。历史原因产生了多种中文编码,ASCII(128 个字母和符号,英文够用)被所有编码兼容,而最常见的 UTF-8 与 GBK 之间除了ASCII 部分之外没有交集。文件采用什么编码方式,就用什么编码方式打开。只要是用不兼容的编码方式打开文件,就会出现乱码。
GBK(国标扩展)系列,根据包含汉字符号从少到多。依次是GB2312: 只包含 6763 个汉字;GBK: 包含 20902 个汉字,基本足够用;GB18030: 又分GB1830-2000 和 GB1830-2005,包含七万多个汉字;GBK 编码的汉字基本是2 字节,节省空间,但只适合国内中文环境。
UTF-8 编码(Unicode 转换格式),是 Unicode 的再表示,支持各个国家的文字符号,兼容性非常好。所以,目前 UTF-8 有一统天下的趋势。UTF-8 是一种变长编码,解决字符间分隔的方式是通过对二进制中最高位连续 1 的个数来决定该字是几字节编码。所有常用汉字的 Unicode 值均可用 3 字节的 UTF-8 表示出来。UTF-8 通常不带 BOM (字节序标记 EF BB BF,位于文件的前 3 个字节)也不需要带BOM,但 Windows 历史遗留问题又会经常遇到有 BOM UTF-8 的数据文件。
——其他编码
ANSI: 不是真正的编码,而是 Windows 系统的默认编码的统称,对于简体中文系统就是GB2312;对于繁体中文系统就是 Big5 等
Latin1: 又称 ISO-8859-1,欧洲人发明的编码,也是 MySQL 的默认编码
Unicode big endian: 用 UCS-2 格式存储 Unicode 时,根据两个字节谁在前谁在后,分为 Little endian(小端)和 Big endian(大端)
UTF-16, UTF-32: Unicode 的另两种再表示,分别用 2 字节和 4 字节。
中文乱码的解决办法
首先,查看并确认你的 windows 系统的默认编码方式:
Sys.getlocale("LC_CTYPE") # 查看系统默认字符集类型
#[1] "Chinese (Simplified)_China.936" #代码936就表明是"中国- 简体中文(GB2312)"
大多数中文乱码都是 GBK 与 UTF-8 不兼容导致的,常见的有两种情形。在你的电脑不中文乱码的 R 脚本、Rmarkdown 等,拷贝到另一台电脑上时出现中文乱码。解决办法:前文在配置 Rstudio 时已讲到,设置 code-saving 的 Default text encoding 为兼容性更好的 UTF-8。数据文件采用什么编码方式,就用什么编码方式打开或读取。采用了不兼容的另一种编码打开或读取,肯定出现中文乱码。
其次,最简单的处理,打开Rstudio中菜单File—Reopen with Eecoding界面,修改中文解码源即可。
参考文献
(【R语言新书】2.2 数据读写)[https://zhuanlan.zhihu.com/p/256284851]