2013-03-18 42 views
11

我正在處理包含16個問題的數據集,其中響應集是相同的(是,否,未知或丟失)。我正在使用R處理數據,並且我想將每個變量轉換爲一個因子。對於一個變量,我可以用下面的結構:將相同的因子水平應用於R數據框中的多個變量

df <- read.csv("thedata.csv") 
df$q1 <- factor(x=df$q1,levels=c(-9,0,1), 
         labels=c("Unknown or Missing","No","Yes)) 

我想避免打字是16倍。我可以用for()這樣做,但我想知道是否有更清晰,更R的方法來做到這一點。一些示例數據:

structure(list(q1 = c(0, 0, 0, -9, 0), q2 = c(0, 0, 1, 0, 0), 
       q3 = c(0, 0, 1, 0, 0), q4 = c(1, 1, 0, 0, 0), 
       q5 = c(0, 1, 1, 1, 1), q6 = c(1, 1, 1, 0, 0), 
       q7 = c(0, 0, 0, 1, 0), q8 = c(0, 0, 1, 1, 1), 
       q9 = c(1, 0, -9, 1, 0), q10 = c(1, 0, 0, 0, 0), 
       q11 = c(0, 1, 1, 0, 0), q12 = c(1, 1, 0, 0, 0), 
       q13 = c(1, -9, 1, 0, 0), q14 = c(0, 0, 0, 1, 1), 
       q15 = c(1, 0, 1, 1, 0), q16 = c(1, 1, 1, 1, 1)), 
       .Names = c("q1", "q2", "q3", "q4", "q5", "q6", "q7", 
          "q8", "q9", "q10", "q11", "q12", "q13", 
          "q14", "q15", "q16"), 
       row.names = c(NA, -5L), class = "data.frame") 

回答

18
df[] <- lapply(df, factor, 
       levels=c(-9, 0, 1), 
       labels = c("Unknown or Missing", "No", "Yes")) 
str(df) 

可能比應用或sapply這就需要data.frame更快改革/重新分類這些結果。這裏的訣竅是,在分配的LHS上使用[]可以保留目標的結構(因爲R「知道」它的類和維度是什麼,並且不需要lapply列表中的data.frame,如果您想要要做到這一點只與選定的列,你可以做到這一點:

df[colnums] <- lapply(df[colnums], factor, 
       levels=c(-9, 0, 1), 
       labels = c("Unknown or Missing", "No", "Yes")) 
str(df) 
1

使用apply

data.frame(apply(df, 2, factor, 
       levels=c(-9, 0, 1), 
       labels = c("Unknown or Missing", "No", "Yes"))) 

的R鹼溶液使用sapply

data.frame(sapply(df, factor, levels=c(-9, 0, 1), 
     labels = c("Unknown or Missing", "No", "Yes"))) 
+0

注意:申請總是把它的輸入轉換成矩陣 – hadley 2013-03-19 01:57:11

相關問題