清理因子水平(折疊多個級別/標簽)清理包含需要折疊的多個級別的因子的最有效(即有效/適當)方法是什么?也就是說,如何將兩個或多個因子級別組合成一個。這是一個示例,其中“是”和“Y”這兩個級別應折疊為“是”,“否”和“N”折疊為“否”:## Given: x <- c("Y", "Y", "Yes", "N", "No", "H") # The 'H' should be treated as NA## expectedOutput[1] Yes Yes Yes No No <NA>Levels: Yes No # <~~ NOTICE ONLY **TWO** LEVELS一個選擇當然是在手工使用sub和朋友之前清理琴弦。另一種方法是允許重復標簽,然后丟棄它們## Duplicate levels ==> "Warning: deprecated"x.f <- factor(x, levels=c("Y", "Yes", "No", "N"), labels=c("Yes", "Yes", "No", "No"))## the above line can be wrapped in either of the next two linesfactor(x.f) droplevels(x.f)但是,有更有效的方法嗎?雖然我知道levels和labels參數應該是向量,但我嘗試了列表和命名列表以及命名向量以查看發生了什么不用說,以下沒有一個讓我更接近我的目標。 factor(x, levels=list(c("Yes", "Y"), c("No", "N")), labels=c("Yes", "No"))
factor(x, levels=c("Yes", "No"), labels=list(c("Yes", "Y"), c("No", "N")))
factor(x, levels=c("Y", "Yes", "No", "N"), labels=c(Y="Yes", Yes="Yes", No="No", N="No"))
factor(x, levels=c("Y", "Yes", "No", "N"), labels=c(Yes="Y", Yes="Yes", No="No", No="N"))
factor(x, levels=c("Yes", "No"), labels=c(Y="Yes", Yes="Yes", No="No", N="No"))
3 回答

動漫人物
TA貢獻1815條經驗 獲得超10個贊
由于問題的標題是清理因子水平(折疊多個級別/標簽),forcats
為了完整起見,此處也應該提到包。forcats
于2016年8月在CRAN上亮相。
有幾種便利功能可用于清理因子水平:
x <- c("Y", "Y", "Yes", "N", "No", "H") library(forcats)
將要素級別折疊為手動定義的組
fct_collapse(x, Yes = c("Y", "Yes"), No = c("N", "No"), NULL = "H")#[1] Yes Yes Yes No No <NA>#Levels: No Yes
手動改變因子水平
fct_recode(x, Yes = "Y", Yes = "Yes", No = "N", No = "No", NULL = "H")#[1] Yes Yes Yes No No <NA>#Levels: No Yes
自動重新標記因子水平,必要時崩潰
fun <- function(z) { z[z == "Y"] <- "Yes" z[z == "N"] <- "No" z[!(z %in% c("Yes", "No"))] <- NA z}fct_relabel(factor(x), fun)#[1] Yes Yes Yes No No <NA>#Levels: No Yes
請注意,它fct_relabel()
適用于因子級別,因此它需要一個因子作為第一個參數。另外兩個函數,fct_collapse()
也fct_recode()
接受一個字符向量,它是一個未記錄的特征。
首次出現重新排序因子水平
OP給出的預期輸出是
[1] Yes Yes Yes No No <NA>Levels: Yes No
這里的級別按其出現的順序排序x
,與默認級別不同(?factor
:默認情況下,因子的級別已排序)。
為了與預期輸出一致,可以通過fct_inorder()
在折疊級別之前使用來實現:
fct_collapse(fct_inorder(x), Yes = c("Y", "Yes"), No = c("N", "No"), NULL = "H")fct_recode(fct_inorder(x), Yes = "Y", Yes = "Yes", No = "N", No = "No", NULL = "H")
現在,兩者都以相同的順序返回預期輸出。

哈士奇WWW
TA貢獻1799條經驗 獲得超6個贊
也許命名向量作為鍵可能是有用的:
> factor(unname(c(Y = "Yes", Yes = "Yes", N = "No", No = "No", H = NA)[x]))[1] Yes Yes Yes No No <NA>Levels: No Yes
這看起來與你上一次嘗試非常相似......但是這個有效:-)
- 3 回答
- 0 關注
- 823 瀏覽
添加回答
舉報
0/150
提交
取消