2015-04-25 14 views
6

Mam zestaw zmiennych zakodowanych jako dwumianowy.zmienne manekina do pojedynczej zmiennej kategorycznej (czynnik) w 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   

Chciałbym połączyć zmienne (VALUE_1, VALUE_2 ... VALUE_8) w jeden czynnik zamówionej, przy zachowaniu kolumny (pre) jak jest, Duch, że dane będzie wyglądać następująco:

Pre VALUE 
1 1 VALUE_6 
2 1 VALUE_5 
3 1 VALUE_5 

Albo jeszcze lepiej:

Pre VALUE 
1 1 6 
2 1 5 
3 1 5 

Zdaję sobie sprawę, że istnieje: Recoding dummy variable to ordered factor

Ale gdy próbuję kod używany w tym poście, otrzymuję następujący błąd:

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? 

Każda pomoc będzie mile widziane

Odpowiedz

5

Szybkim rozwiązaniem byłoby coś

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 jeśli chcesz podać prawdziwe nazwy kolumn (jak wskazano przez @BondedDust), możesz użyć tej samej metodologii, aby je wyodrębnić:

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

LUB można użyć własnego which strategii w następujący sposób (btw, which jest wektorowy więc nie ma potrzeby w użyciu apply z marginesem 1 na nim)

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

LUB możesz do mnożenia matrix (nadesłane przez @akrun)

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

Pracował jak urok. dzięki – Sky

Powiązane problemy