創(chuàng)建
在創(chuàng)建和讀入dataframe時(shí)容劳,R在默認(rèn)條件下會(huì)自動(dòng)將含有字符串的column轉(zhuǎn)化為factor需纳。factor()函數(shù)則能夠手動(dòng)將string轉(zhuǎn)化為factor。levels()和nlevel()能夠查看factor的具體情況。
> x <- iris$Species
> class(x)
[1] "factor"
> levels(x) ; nlevels(x)
[1] "setosa" "versicolor" "virginica"
[1] 3
操作
要改動(dòng)factor中的levels先后順序我注,應(yīng)當(dāng)在factor(... , levels=c() )中改動(dòng)捆憎,不能直接向levels()中傳遞變量舅柜,否則極容易出錯(cuò)。relevel()則是較為安全的一個(gè)函數(shù)躲惰,它能夠?qū)⒛硞€(gè)level直接提到最前作為ref level致份,適用于某些回歸分析。
事實(shí)上relevel()是factor()的wrapper础拨。
relevel(x, ref, ...)
> y <- sample(x,6) ; y
[1] versicolor setosa virginica setosa virginica versicolor
Levels: setosa versicolor virginica
> relevel(y , 'versicolor')
[1] versicolor setosa virginica setosa virginica versicolor
Levels: versicolor setosa virginica #函數(shù)直接輸出新的string
如果在數(shù)據(jù)清洗過程中氮块,某個(gè)level對(duì)應(yīng)的值全部被刪除,以至于string存在無用的‘空’level诡宗√喜酰可以使用droplevels()來進(jìn)行精簡(jiǎn)。接受factor或df輸入塔沃,輸出新的factor或df蝠引。
## S3 method for class 'factor'
droplevels(x, exclude = if(anyNA(levels(x))) NULL else NA, ...)
## S3 method for class 'data.frame'
droplevels(x, except, exclude, ...)
從連續(xù)變量中構(gòu)建
R中的cut()函數(shù)能夠?qū)⑦B續(xù)變量轉(zhuǎn)換為區(qū)間分割的factor。在這里breaks是#either a numeric vector of two or more unique cut points or a single number蛀柴。也就是說要么輸入間隔數(shù)螃概,要么輸入一個(gè)vector來規(guī)定所有的間隔刻度線,不能只給出中部的刻度不給兩端鸽疾,否則會(huì)產(chǎn)生NA吊洼。
cut(x, breaks, labels = NULL,
include.lowest = FALSE, right = TRUE, dig.lab = 3, #左開右閉
ordered_result = FALSE, ...)
> x=runif(5,0,10)
> x
[1] 3.2502069 3.7256012 8.8114966 9.6004756 0.8837793
> cut(x,c(3,6,9)) #上限和下限都沒有定義
[1] (3,6] (3,6] (6,9] <NA> <NA>
Levels: (3,6] (6,9]
> cut(x,c(3,6,9,Inf)) #下限沒有定義
[1] (3,6] (3,6] (6,9] (9,Inf] <NA>
Levels: (3,6] (6,9] (9,Inf]
> cut(x,c(-Inf,3,6,9,Inf)) #正確方式
[1] (3,6] (3,6] (6,9] (9, Inf] (-Inf,3]
Levels: (-Inf,3] (3,6] (6,9] (9, Inf]
數(shù)據(jù)清洗時(shí)的一個(gè)小trick
一個(gè)vector本應(yīng)全是numeric類型,但由于來源輸入的問題制肮,導(dǎo)致這個(gè)vector成了string冒窍,此時(shí)應(yīng)當(dāng)怎么辦?
例如一個(gè)vector x=c( 4.645 6.843 2.187 6.351 7.338 6.367) ,由于mistyping弄企,成了c( "4.645" "6..843" "2.187" "6.351" "7.338" "6.367" ) 超燃。而在讀入時(shí),由于R還會(huì)自動(dòng)嘗試把字符串轉(zhuǎn)換為factor拘领,導(dǎo)致事實(shí)上我們手頭得到的是這樣一個(gè)factor y.
> y
[1] 4.645 6..843 2.187 6.351 7.338 6.367
Levels: 2.187 4.645 6..843 6.351 6.367 7.338
書中推薦按照factor -- string -- numeric 的順序來清洗意乓。R的手冊(cè)中推薦更有效的方式是首先將factor的levels轉(zhuǎn)換為數(shù)值,再將數(shù)值按照原factor中unclass的數(shù)值來進(jìn)行排列(因?yàn)閍s.integer(某factor)得到的是unclass數(shù)值)
> as.numeric(as.character(y))
[1] 4.645 NA 2.187 6.351 7.338 6.367
Warning message:
NAs introduced by coercion
> as.numeric(levels(y))[as.integer(y)] #推薦方法
[1] 4.645 NA 2.187 6.351 7.338 6.367
Warning message:
NAs introduced by coercion
快速生成levels / Generate Factor Levels
gl()是factor的另一個(gè)wrapper,能夠快速生成factor.
gl(n, k, length = n*k, labels = seq_len(n), ordered = FALSE)
> gl(3,3,8,labels = LETTERS[1:3])
[1] A A A B B B C C
Levels: A B C
交互 / Interaction
將兩個(gè)factor交互届良,產(chǎn)生新的factor笆凌。
> x=gl(3,3,labels=LETTERS[1:3])
> y=gl(3,3,labels = LETTERS[24:26])
> interaction(x,y)
[1] A.X A.X A.X B.Y B.Y B.Y C.Z C.Z C.Z
Levels: A.X B.X C.X A.Y B.Y C.Y A.Z B.Z C.Z