2017-11-11 167 views
0

,我不知道我是否應該列入各級當我創建從一個列表中的因素:因子水平假人變量R

random_merge_patients$MedCond <-factor(sort(random_merge_patients[[35]])) 

因子的例子看起來是這樣的:

[6589] "wt loss ftt arthritis anemia of chronic disease mild cognitive impairment hx gout dehydration prednisone therapy long term med use" 

如果水平應該被選中,我會選擇什麼?任何人都可以澄清,因爲這是令我困惑的。

我要使用這個變量來創建一個虛擬變量,但即使我在$Dementia沒有錯誤消息,所有的值都爲0,但有些應該是1秒:

random_merge_patients$'MedCond_Dementia'<-ifelse(random_merge_patients$'MedCond' == "dementia",1,0) 
+0

你的例子對於真正的幫助有點稀疏,但是我建議,以你的例子'MedCond'爲例,因素實際上並不合適。我建議把它們保留爲'character',並使用'c $ MedCond_Dementia < - grepl(「\\ bdementia \\ b」,x $ MedCond,ignore.case = TRUE)'',因爲'... ==「由於「字符串包含...」,癡呆症「不起作用」。 – r2evans

回答

2

可能存在的一些混亂它們是什麼因素在R中。它們是一種以允許傳統統計模型將其用作輸入(例如線性建模)的形式表示非數字值的方式。因素有一套固定的「水平」(對於電腦),每一個都有一個「標籤」(對於人類)。但是,R並沒有考慮應該爲標籤提取字符串的哪些方面。

考慮這個小例子。

x = c("wt loss ftt arthritis anemia of chronic disease", 
     "sleep loss ftt dementia", 
     "wt loss ftt arthritis anemia of chronic disease", 
     "wt loss ftt demntia") 

f = factor(x) 
f 
#> [1] wt loss ftt arthritis anemia of chronic disease sleep loss ftt dementia 
#> [3] [3] wt loss ftt arthritis anemia of chronic disease wt loss ftt demntia 
#> 3 Levels: sleep loss ftt dementia ... wt loss ftt demntia 

我們的原始矢量長度爲4,它包含3個獨特的字符串。當我們將它轉​​換爲一個因子時,R會自動創建關卡並按字母順序將標籤分配給這些關卡(因此您的sort無關緊要)。請注意0​​中的第一個值如何以「wt loss」開始,但第一個值以sleep開頭。 R創建了3個級別,因爲有3個唯一值並接受原始字符串作爲標籤。在這一點上,我們的因式矢量實際上只是一個整數矢量,並有一種將標籤映射到這些整數的方法。

as.numeric(f) 
#> [1] 2 1 2 3 

再次注意級別(數字部分)是如何按字母順序創建的。因此,採用字符串並將其轉換爲因子有助於R爲線性模型自動創建虛擬變量,但如果要設計自己的功能(例如,創建「癡呆症」列),它不會帶來額外的好處。

對於這種情況下的特徵工程,您最好查看正則表達式。例如,如果我想創造編碼減肥矢量我可以這樣做:

wt.loss = grepl("w[^ ]*t loss",x) 
wt.loss 
#> [1] TRUE FALSE TRUE TRUE 
  • grepl是一個合乎邏輯的grep(其中grep是一個搜索功能),所以它會返回TRUE/FALSE
  • "w[^ ]*t loss"搜索看起來像「w(任何非空格字符重複0或更多次)t損失」的子字符串,因此它會匹配「wt loss」或「weight loss」。
  • x指定搜索的載體。

您可以根據您想要工程師儘可能多的功能做到這一點。尋找癡呆將是grepl("dementia",x)。如果有多個術語都意味着您可以使用|基本上相同的東西標記一個或一個條件(例如grepl("osteoperosis|calcium loss in bones",x))。

+0

馬克,優秀的解釋,非常感謝。這證實了曾經想過要做的事情,併發揮了作用。我無法贊成你,因爲我是網站上的新手,但謝謝你。 htn < - grepl(「htn」,random_merge_patients $'MedCond') random_merge_patients $'MedCond_HTN'< - ifelse(htn == T,1,0) –

+0

@coding_is_fun您可以接受答案(這也給了您聲望)。另外 - 你不需要第二個'ifelse'語句 - 如果需要,二進制會自動轉換爲數字1/0。嘗試「TRUE + TRUE == 2」 – Mark