亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

清理因子水平(折疊多個級別/標簽)

清理因子水平(折疊多個級別/標簽)

眼眸繁星 2019-07-26 17:02:07
清理因子水平(折疊多個級別/標簽)清理包含需要折疊的多個級別的因子的最有效(即有效/適當)方法是什么?也就是說,如何將兩個或多個因子級別組合成一個。這是一個示例,其中“是”和“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")

現在,兩者都以相同的順序返回預期輸出。


查看完整回答
反對 回復 2019-07-26
?
哈士奇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

這看起來與你上一次嘗試非常相似......但是這個有效:-)


查看完整回答
反對 回復 2019-07-26
  • 3 回答
  • 0 關注
  • 823 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號