2015-04-25 11 views
6

Ich habe eine Reihe von Variablen als binomial codiert.Dummy-Variablen auf einzelne kategoriale Variable (Faktor) in R

Pre VALUE_1 VALUE_2 VALUE_3 VALUE_4 VALUE_5 VALUE_6 VALUE_7 VALUE_8 
1 1  0  0  0  0  0  1  0  0  
2 1  0  0  0  0  1  0  0  0  
3 1  0  0  0  0  1  0  0  0  
4 1  0  0  0  0  1  0  0  0   

Ich möchte die Variablen (VALUE_1, VALUE_2 ... VALUE_8) in einem einzigen geordneten Faktor verschmelzen, während die Erhaltung der Säule (Pre) wie es ist, duch dass die Daten wie folgt aussehen würde:

Pre VALUE 
1 1 VALUE_6 
2 1 VALUE_5 
3 1 VALUE_5 

Oder noch besser:

Pre VALUE 
1 1 6 
2 1 5 
3 1 5 

ich bin mir bewusst, dass diese existiert: Recoding dummy variable to ordered factor

Aber wenn ich den Code versuchen, in diesem Beitrag verwendet, erhalte ich folgende Fehlermeldung:

PA2$Factor = factor(apply(PA2, 1, function(x) which(x == 1)), labels = colnames(PA2)) 

Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
Have you called 'sort' on a list? 

Jede Hilfe

Antwort

5

Eine schnelle Lösung wäre klar sein, wäre so etwas wie

Res <- cbind(df[1], VALUE = factor(max.col(df[-1]), ordered = TRUE)) 
Res 
# Pre VALUE 
# 1 1  6 
# 2 1  5 
# 3 1  5 
# 4 1  5 

str(Res) 
# 'data.frame': 4 obs. of 2 variables: 
# $ Pre : int 1 1 1 1 
# $ VALUE: Ord.factor w/ 2 levels "5"<"6": 2 1 1 1 

OR Wenn Sie die tatsächlichen Namen der Spalten (wie von @BondedDust gezeigt) möchten, können Sie die gleiche Methode verwenden, um sie zu extrahieren

factor(names(df)[1 + max.col(df[-1])], ordered = TRUE) 
# [1] VALUE_6 VALUE_5 VALUE_5 VALUE_5 
# Levels: VALUE_5 < VALUE_6 

ODER Sie Ihre eigene which Strategie auf folgende Weise verwenden können (btw, ist which so dass keine Notwendigkeit vektorisiert in Verwendung apply mit einer Marge von 1 auf ihm)

cbind(df[1], VALUE = factor(which(df[-1] == 1, arr.ind = TRUE)[, 2], ordered = TRUE)) 

OR möglich do matrix Multiplikation (beigetragen von @akrun)

cbind(df[1], VALUE = factor(as.matrix(df[-1]) %*% seq_along(df[-1]), ordered = TRUE)) 
+1

Arbeitete wie ein Charme. Vielen Dank – Sky

Verwandte Themen