R語(yǔ)言編碼問題的解決
今天博客主要是解決一個(gè)學(xué)R語(yǔ)言里面最最痛苦的問題(嗯,python2.x里面也有),就是中文亂碼問題:
一般用R語(yǔ)言的同學(xué),多半遇見過以下這個(gè)問題:
反正蝦神我每次遇見這個(gè)問題,立刻就是:
實(shí)際上這個(gè)問題寫代碼的人一般都能遇見,不同字符編碼的問題,如果是從文件里面讀的還好說,可以帶這個(gè)字符編碼集一起讀,但是如果這個(gè)數(shù)據(jù)是來自于數(shù)據(jù)庫(kù)的,如果經(jīng)驗(yàn)的話,那就真得各種涼拌了。
下面我簡(jiǎn)單把我今天通過R語(yǔ)言從Postgresql數(shù)據(jù)庫(kù)中處理中文問題的整個(gè)流程說說,如果哪位同學(xué)也遇上了,可以參考我的整個(gè)解決方式。
下面這個(gè)代碼是簡(jiǎn)單的從R連接Postgresql獲取數(shù)據(jù)的過程,如果沒有中文,就一切ok:
library(ggplot2) library(RPostgreSQL) drv= dbDriver("PostgreSQL") pgCon=dbConnect(drv,user="sde",password="sde",host="127.0.0.1") s ="select * from chinapop" rs = dbSendQuery(pgdb, statement = s) df = fetch(rs, n = -1)
數(shù)據(jù)是我SDE庫(kù)里面的,內(nèi)容如下:
在數(shù)據(jù)庫(kù)里面表現(xiàn)如下:
結(jié)構(gòu)非常簡(jiǎn)單,大部分字段都是數(shù)字型,只有name這個(gè)字段是中文的,當(dāng)我們運(yùn)行連接和查詢之后,在R語(yǔ)言里面就變成了這個(gè)一個(gè)dataframe:
然后我們?nèi)绻脒M(jìn)行一下查詢,比如要查一下以“南”在結(jié)尾的?。ê?、河南、海南、云南),那么sql語(yǔ)句變成:
一下就讓我們抓狂了……生無可戀啊……
然后我們來看看為什么會(huì)出現(xiàn)這個(gè)問題,首先當(dāng)然看看你的R語(yǔ)言的環(huán)境,這個(gè)可以通過sessionInfo()來實(shí)現(xiàn)
原來R語(yǔ)言默認(rèn)使用的是你系統(tǒng)的字符集——我這里win7中文版,默認(rèn)的字符集就是cp936,也就是所謂的gb2312編碼。
然后再來看看我們數(shù)據(jù)庫(kù)用的編碼,我這里是Postgersql,其他的數(shù)據(jù)庫(kù)查看方式自己百度:
字符編碼是UTF-8……好吧,知道這個(gè)問題就好解決了。
首先,從數(shù)據(jù)庫(kù)里面獲取的數(shù)據(jù),回來的是UTF8的,那么我們可以轉(zhuǎn)成R的字符編碼,轉(zhuǎn)換的函數(shù)R語(yǔ)言里面已經(jīng)提供了,叫做iconv(), 如下:
將df里面的name數(shù)列,從UTF8的編碼,轉(zhuǎn)換為CP936,這樣就變成了中文了。
下面就可以用同樣的方式來處理中文查詢的問題:
這次是從CP936轉(zhuǎn)換為UTF8來執(zhí)行,語(yǔ)句如下:
s =paste("select * from chinapop where name like '%",iconv("南","CP936","UTF8"),"'",sep = "")
paster函數(shù),是R語(yǔ)言里面的字符串連接函數(shù)。
下面拋出了一個(gè)警告,所里面有個(gè)字段類型是st_geometry類型的,R語(yǔ)言讀不了……這個(gè)是ArcGIS的東西,直接不管。
然后我們可以看出,查出來4條數(shù)據(jù),說明SQL語(yǔ)句執(zhí)行成功了,但是回來的還是亂碼,接下去用上面說的iconv()函數(shù)轉(zhuǎn)換一下就行:
到此,中文問題解決.
后面就是R語(yǔ)言老本行分析&可視化了,我們把這4個(gè)省的2008年的GDP做一個(gè)柱狀圖,代碼如下(用的是ggplot2)
qplot(name,gdp_2008,data=df,fill=gdp_2008)+geom_bar(stat='identity')
如果還需要其他的各種分析可視化,敲命令就可以了,打完收工。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
R語(yǔ)言邏輯回歸、ROC曲線與十折交叉驗(yàn)證詳解
這篇文章主要給大家介紹了關(guān)于R語(yǔ)言邏輯回歸、ROC曲線與十折交叉驗(yàn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03R語(yǔ)言rhdf5讀寫hdf5并展示文件組織結(jié)構(gòu)和索引數(shù)據(jù)
這篇文章主要為大家介紹了R語(yǔ)言rhdf5讀寫hdf5并展示文件組織結(jié)構(gòu)和索引數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06R語(yǔ)言基本對(duì)象類型知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理了一篇關(guān)于R語(yǔ)言基本對(duì)象類型知識(shí)點(diǎn)詳解內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2021-03-03R語(yǔ)言可視化存儲(chǔ)矢量圖實(shí)現(xiàn)方式
這篇文章主要為大家介紹了R語(yǔ)言存儲(chǔ)矢量圖的實(shí)現(xiàn)方式過程,有需要的朋友可以借鑒參考下,希望能夠有所你幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11R語(yǔ)言中c()函數(shù)與paste()函數(shù)的區(qū)別說明
這篇文章主要介紹了R語(yǔ)言中c()函數(shù)與paste()函數(shù)的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04R語(yǔ)言時(shí)間序列中時(shí)間年、月、季、日的處理操作
這篇文章主要介紹了R語(yǔ)言時(shí)間序列中時(shí)間年、月、季、日的處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03R語(yǔ)言線性回歸知識(shí)點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于R語(yǔ)言線性回歸知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。2021-05-05