2017-02-07 50 views
1

這可能是超級平凡的,但我無法弄清楚。 我正在編寫一個R腳本,用於清理/組織我的數據(仍在收集數據),以便一旦完成數據收集,我就會完成所有已寫入的內容。 我遇到了因子變量的問題。種族/種族變量存儲爲數字:1 =白色,2 =黑色,3 =亞洲人,4 =西班牙裔,5 =其他。 眼下五大變化是這樣的:指定因子變量

race <- c(1, 1, 3, 5, 2) 

我想比賽變量轉換成的因素,所以我嘗試:

​​

但我得到的錯誤:

Error in factor(race, labels = c("white", "black", "asian", "hisp", 
"native", : invalid 'labels'; length 6 should be 1 or 4 

我猜這是因爲我說有6個標籤,但在我的數據集中,只有6個可能結果中有4個是觀察結果。 我相信這可以用levels參數來解決,但我無法弄清楚何時何地使用它。我試過

race.f <- factor(race, levels = c("white", "black", "asian", "hisp", 
"native", "other")) 

它剛剛創建了一堆NAS。 如果我碰巧從6個種族中的每個種族的至少一個人收集數據,我上面發佈的代碼將工作。但是,這不會保證會發生。在收集數據之前編寫腳本時,我應該如何處理這個問題?我想要它來處理所有可能的結果。 謝謝!

回答

0

你得到NA因爲,race在默認情況下是不是factor,並用它裏面factor(),因爲它是導致NA因爲它不是能夠找到race指定的水平。因此,我們必須首先匹配race值設爲其相應的races

對於這一點,我們需要有一個查找矢量象下面這樣:

vec <- c("white"=1, "black" = 2, "asian" = 3,"hispanic" = 4, "other" = 5) 

set.seed(100) 
race <- sample(1:5, 8, replace = T) 
# [1] 2 2 3 1 3 3 5 2 

race_new <- names(vec)[match(race, vec)] # match() returns the position where race matched with vec in vec 
factor(race_new, levels = names(vec)) 
# [1] black black asian white asian asian other black 
# Levels: white black asian hispanic other 

@國際海事組織的建議(更簡潔):或者你可以同時使用水平與標籤參數係數:

race.f <- factor(race, levels=1:6, labels = c("white", "black", "asian", 
               "hisp", "native", "other")) 
+1

或者你可以有標籤參數一起使用水平'factor':'race.f < - 因子(種族,等級= 1:6,標籤= C(」白色「,」黑色「,」亞洲「,」hisp「,」本地「,」其他「))。 – lmo

+0

@lmo建議您單獨作爲答案。 – Gregor

+0

@Imo我已經添加了你的建議謝謝! –

0

race水平是整數,你需要定義人創建升標籤時因素:

race.f <- factor(race, 
       levels = 1:6, # one for each label 
       labels = c("white", "black", "asian", 
          "hisp", "native", "other"))