2015-04-25 22 views
6

Ho un set di variabili codificate come binomiale.variabili dummy per singola variabile categoriale (fattore) 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   

vorrei unire le variabili (VALUE_1, VALUE_2 ... VALUE_8) in un unico fattore ordinato, pur conservando la colonna (Pre) come è, Duch che i dati sarebbero simile a questa:

Pre VALUE 
1 1 VALUE_6 
2 1 VALUE_5 
3 1 VALUE_5 

O ancora meglio:

Pre VALUE 
1 1 6 
2 1 5 
3 1 5 

sono consapevole che questo esiste: Recoding dummy variable to ordered factor

Ma quando provo il codice utilizzato in questo post, ricevo il seguente errore:

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? 

Qualsiasi aiuto sarebbe apprezzato

risposta

5

Una soluzione rapida sarebbe qualcosa di simile

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 

O se si desidera il nome effettivo delle colonne (come indicato da @BondedDust), è possibile utilizzare la stessa metodologia per estrarle.

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

O è possibile utilizzare la vostra strategia which nel seguente modo (a proposito, which è Vettorializzare quindi non c'è bisogno di utilizzare apply con un margine di 1 su di esso)

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

O è possibile do matrix moltiplicazione (contribuito da @akrun)

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

Ha funzionato come un fascino. Grazie – Sky

Problemi correlati