溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在R語(yǔ)言中對(duì)數(shù)據(jù)進(jìn)行重新編碼

發(fā)布時(shí)間:2021-04-17 15:13:37 來源:億速云 閱讀:546 作者:Leah 欄目:開發(fā)技術(shù)

怎么在R語(yǔ)言中對(duì)數(shù)據(jù)進(jìn)行重新編碼?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

(一)使用邏輯判斷式

(1)現(xiàn)假設(shè)我們需要將下面的連續(xù)型變量x按照10與20分成三個(gè)組,新的分組名稱為1、2、3:

怎么在R語(yǔ)言中對(duì)數(shù)據(jù)進(jìn)行重新編碼

> 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ù)分成“低收入”,“中等收入”,“高收入”三個(gè)組:

> 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ù)

基本語(yǔ)法:ifelse(邏輯判斷式,TRUE-表達(dá)式,FALSE-表達(dá)式)

編碼成兩個(gè)分組:

> 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%運(yùn)算符,將"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"

當(dāng)編碼成三個(gè)或者三個(gè)以上的組時(shí)需要多次使用ifelse 函數(shù):

將x按照10與20兩個(gè)分割點(diǎn)分成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ù)我們?cè)O(shè)置的分割點(diǎn)(breaks)將數(shù)據(jù)重編碼,將一個(gè)數(shù)值向量變量轉(zhuǎn)換為分組形態(tài)的factors變量。

基本語(yǔ)法:

cut(x,breaks,labels,include.lowest=F,right=T)

其中

x為數(shù)值向量

breaks為分割點(diǎn)信息。若breaks為向量,則根據(jù)向量中的數(shù)字進(jìn)行分割。若breaks為大于1正整數(shù)k,則將

x分成均等的k組。

labels為分割后各組的名稱,若為null,則輸出數(shù)字向量,否則輸出factor變量。

include.lowest=FALSE表示分割時(shí)不含各區(qū)間端點(diǎn)的最小值。

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ù)自動(dòng)按照分割點(diǎn)生成分組名稱:

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個(gè)N(60,10)的隨機(jī)成績(jī),并且使用cut函數(shù)的breaks選項(xiàng)將其分成5個(gè)組:

> 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ù)默認(rèn)輸出一個(gè)factor變量,并且自動(dòng)將五個(gè)分組命名為“ (39,46.2]”…“ (67.8,75]”。如果cut()的選項(xiàng)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變量重新編碼。

基本語(yǔ)法:recode(x,recodes,as.factor.result,levels)

其中:

x為數(shù)值向量,字符向量或者factor 變量。

recode為設(shè)定重新編碼規(guī)則的字符串。

as.factor.result為是否輸出factor變量。若是則為TRUE,不是為FALSE。

levels為排序向量。指定新的編碼分組的順序(默認(rèn)是按照分組名稱排序)。

recodes參數(shù)編碼規(guī)則的寫法

recodes參數(shù)的值是一個(gè)字符串,字符串里面是以分號(hào)分隔的編碼規(guī)則:

recodes=“規(guī)則1;規(guī)則2…”

每一個(gè)編碼規(guī)則的格式為舊碼列表=新碼,“舊碼列表”部分可用lo代表舊碼的最小值(low)、hi代表舊碼的最大值(high)撰寫規(guī)則如下:

(1)舊碼=新碼 舊碼只有單一數(shù)值。例如:“0=NA”表示將0改為NA。

(2)舊碼向量=新碼 多個(gè)舊碼改為一個(gè)新碼。例如:“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"

將成績(jī)0~40分之間的分?jǐn)?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"

補(bǔ)充:R語(yǔ)言字符串處理時(shí)的編碼的一些問題問題(Windows環(huán)境)

R在windows中文系統(tǒng)時(shí)默認(rèn)使用GB編碼字符,而許多函數(shù)是只支持UTF-8的,例如

怎么在R語(yǔ)言中對(duì)數(shù)據(jù)進(jìn)行重新編碼

不作任何處理讀入數(shù)據(jù)時(shí),數(shù)據(jù)會(huì)以系統(tǒng)默認(rèn)編碼讀入,tolower()函數(shù)工作失敗

如果有干預(yù)的讀入數(shù)據(jù),即指定字符串的編碼,則不會(huì)出錯(cuò)

怎么在R語(yǔ)言中對(duì)數(shù)據(jù)進(jìn)行重新編碼

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI