R語言-進行數(shù)據(jù)的重新編碼(recode)操作
在分析數(shù)據(jù)時我們經(jīng)常會遇到將變量值轉(zhuǎn)換成其他的值的情況(如:將連續(xù)變量轉(zhuǎn)成分類變量)這時就需要我們對原有數(shù)據(jù)進行重新編碼。本文將介紹R軟件中常用的三種重編嗎方法:
1、使用邏輯判斷式編碼。
2、使用cut函數(shù)編碼。
3、使用car程序包的recode函數(shù)。
(一)使用邏輯判斷式
(1)現(xiàn)假設(shè)我們需要將下面的連續(xù)型變量x按照10與20分成三個組,新的分組名稱為1、2、3:
> x2=1*(x<=10)+2*(x>10&x<=20)+3*(x>20) > x2 [1] 1 2 3 2 3 3 3 3 1 3 3 2 1 2 3 3 3 2 3 3
將上述變量的數(shù)字編碼改為字符編碼
> labels=c("A","B","C") > x3=labels[x2] > x3 [1] "A" "B" "C" "B" "C" "C" "C" "C" "A" "C" "C" "B" "A" "B" "C" "C" "C" "B" "C" "C"
假設(shè)如下將以下范例月收入數(shù)據(jù)分成“低收入”,“中等收入”,“高收入”三個組:
> income<-c(130065,82961,133076,123028,108945,173466,17477) > income [1] 130065 82961 133076 123028 108945 173466 17477 > newcodes=c("低收入","中等收入","高收入") Error: unexpected input in "newcodes=c("低收入"? > newcodes=c("低收入","中等收入","高收入") > index=1*(income<20000)+2*(income>=20000&income<=60000)+3*(income>60000) > income=newcodes[index] > income [1] "高收入" "高收入" "高收入" "高收入" "高收入" "高收入" "低收入"
(2)使用ifelse函數(shù)
基本語法:ifelse(邏輯判斷式,TRUE-表達式,FALSE-表達式)
編碼成兩個分組:
> x [1] 4 12 50 18 50 22 23 46 8 46 36 18 10 14 35 48 23 17 29 30 > (x2=ifelse(x<=30,1,2)) [1] 1 1 2 1 2 1 1 2 1 2 2 1 1 1 2 2 1 1 1 1 > (x3=ifelse(x<=30,"A","B")) [1] "A" "A" "B" "A" "B" "A" "A" "B" "A" "B" "B" "A" "A" "A" "B" "B" "A" "A" "A" "A"
搭配%int%運算符,將"A",“C"重編碼為"Group1”,“B”,“D"重編碼為"Group2”:
> y [1] "B" "A" "C" "C" "B" "A" "D" "B" "C" "D" > (y2=ifelse(y %in% c("A","C"),"Group1","Group2")) [1] "Group2" "Group1" "Group1" "Group1" "Group2" "Group1" "Group2" "Group2" "Group1" "Group2"
當編碼成三個或者三個以上的組時需要多次使用ifelse 函數(shù):
將x按照10與20兩個分割點分成1、2、3三組:
> x [1] 4 12 50 18 50 22 23 46 8 46 36 18 10 14 35 48 23 17 29 30 > (x2=ifelse(x<=10,1,ifelse(x<20,2,3))) [1] 1 2 3 2 3 3 3 3 1 3 3 2 1 2 3 3 3 2 3 3
將“A”“E”編碼為1,"C"編碼為2,“B”“D”編碼為3:
> y [1] "B" "A" "C" "C" "B" "A" "D" "B" "C" "D" > y2=ifelse(y%in%c("A","E"),1,ifelse(y=="C",2,3)) > y2 [1] 3 1 2 2 3 1 3 3 2 3
(二)使用cut 函數(shù)
cut函數(shù)可以根據(jù)我們設(shè)置的分割點(breaks)將數(shù)據(jù)重編碼,將一個數(shù)值向量變量轉(zhuǎn)換為分組形態(tài)的factors變量。
基本語法:
cut(x,breaks,labels,include.lowest=F,right=T)
其中
x為數(shù)值向量
breaks為分割點信息。若breaks為向量,則根據(jù)向量中的數(shù)字進行分割。若breaks為大于1正整數(shù)k,則將
x分成均等的k組。
labels為分割后各組的名稱,若為null,則輸出數(shù)字向量,否則輸出factor變量。
include.lowest=FALSE表示分割時不含各區(qū)間端點的最小值。
right=T表示各區(qū)間為左端open,右端closed的區(qū)間
使用cut函數(shù)將x向量依照0、10、20,max(x)分成3組
> x [1] 4 12 50 18 50 22 23 46 8 46 36 18 10 14 35 48 23 17 29 30 > x2=cut(x,breaks = c(0,10,20,max(x)),labels = c(1,2,3)) > x2 [1] 1 2 3 2 3 3 3 3 1 3 3 2 1 2 3 3 3 2 3 3 Levels: 1 2 3 > as.vector(x2) [1] "1" "2" "3" "2" "3" "3" "3" "3" "1" "3" "3" "2" "1" "2" "3" "3" "3" "2" "3" "3"
若沒有給定labels參數(shù),cut函數(shù)自動按照分割點生成分組名稱:
x3=cut(x,breaks = c(0,10,20,max(x))) > x3 [1] (0,10] (10,20] (20,50] (10,20] (20,50] (20,50] (20,50] (20,50] (0,10] (20,50] (20,50] (10,20] (0,10] [14] (10,20] (20,50] (20,50] (20,50] (10,20] (20,50] (20,50] Levels: (0,10] (10,20] (20,50]
現(xiàn)在我們模擬產(chǎn)生10個N(60,10)的隨機成績,并且使用cut函數(shù)的breaks選項將其分成5個組:
> score=round(rnorm(10,60,10)) > score [1] 39 65 60 69 58 69 70 62 61 75 > score.cut=cut(score,breaks=5) > score.cut [1] (39,46.2] (60.6,67.8] (53.4,60.6] (67.8,75] (53.4,60.6] (67.8,75] (67.8,75] (60.6,67.8] [9] (60.6,67.8] (67.8,75] Levels: (39,46.2] (46.2,53.4] (53.4,60.6] (60.6,67.8] (67.8,75]
由以上結(jié)果可知,cut()函數(shù)默認輸出一個factor變量,并且自動將五個分組命名為“ (39,46.2]”…“ (67.8,75]”。如果cut()的選項labels=FALSE,則輸出的結(jié)果是數(shù)字編碼的一半向量變量:
> score.cut=cut(score,breaks=5,labels = F) > score.cut [1] 1 4 3 5 3 5 5 4 4 5 > score.cut=as.factor(score.cut) > score.cut [1] 1 4 3 5 3 5 5 4 4 5 Levels: 1 3 4 5
(三)使用car程序包中的recode函數(shù)
car程序包的recode函數(shù)可以將數(shù)值或者字符向量、factor變量重新編碼。
基本語法:recode(x,recodes,as.factor.result,levels)
其中:
x為數(shù)值向量,字符向量或者factor 變量。
recode為設(shè)定重新編碼規(guī)則的字符串。
as.factor.result為是否輸出factor變量。若是則為TRUE,不是為FALSE。
levels為排序向量。指定新的編碼分組的順序(默認是按照分組名稱排序)。
recodes參數(shù)編碼規(guī)則的寫法
recodes參數(shù)的值是一個字符串,字符串里面是以分號分隔的編碼規(guī)則:
recodes=“規(guī)則1;規(guī)則2…”
每一個編碼規(guī)則的格式為舊碼列表=新碼,“舊碼列表”部分可用lo代表舊碼的最小值(low)、hi代表舊碼的最大值(high)撰寫規(guī)則如下:
(1)舊碼=新碼 舊碼只有單一數(shù)值。例如:“0=NA”表示將0改為NA。
(2)舊碼向量=新碼 多個舊碼改為一個新碼。例如:“c(7,8,9)=‘high'”,將7,8,9改為high。
(3)start:end=新碼 有序數(shù)字改碼。例如:“l(fā)o:19=‘C'”。
(4)else=新碼 所有其他情況。例如:“else=NA”。
程序范例:
> library(carData) > library(car) > x [1] 1 2 3 1 2 3 1 2 3 > recode(x,"c(1,2)='A';else='B'") [1] "A" "A" "B" "A" "A" "B" "A" "A" "B"
將成績0~40分之間的分數(shù)編碼為1,41-60分之間為2,61-80分為3,81以上為4,其他情況為NA
> score [1] 75 70 66 65 55 69 75 69 82 83 > recode(score,"lo:40=1;41:60=2;61:80=3;81:hi=4;else=NA") [1] 3 3 3 3 2 3 3 3 4 4
上例改用‘A'‘B'‘C''‘D'
> recode(score,"lo:40='A';41:60='B';61:80='C';81:hi='D';else=NA") [1] "C" "C" "C" "C" "B" "C" "C" "C" "D" "D"
補充:R語言字符串處理時的編碼的一些問題問題(Windows環(huán)境)
R在windows中文系統(tǒng)時默認使用GB編碼字符,而許多函數(shù)是只支持UTF-8的,例如
不作任何處理讀入數(shù)據(jù)時,數(shù)據(jù)會以系統(tǒng)默認編碼讀入,tolower()函數(shù)工作失敗
如果有干預(yù)的讀入數(shù)據(jù),即指定字符串的編碼,則不會出錯
數(shù)據(jù)庫讀寫中文出現(xiàn)亂碼的原理也是相似的。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
R語言中assign函數(shù)和get函數(shù)的用法
這篇文章主要介紹了R語言中assign函數(shù)和get函數(shù)的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04R語言數(shù)可視化Split?violin?plot小提琴圖繪制方法
這篇文章主要為大家介紹了R語言數(shù)可視化Split?violin?plot小提琴圖繪制方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02R語言兩組變量特征相關(guān)關(guān)系熱圖繪制畫法
本文為大家介紹了如何畫兩組變量(特征)的相關(guān)關(guān)系熱圖的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02