2015-04-25 98 views
6

我有一組編碼爲二項式的變量。虛擬變量到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   

我想變量(VALUE_1,VALUE_2 ... VALUE_8)合併成一個單一的有序的因素,同時保護柱(預)原樣,杜赫的數據是這樣的:

Pre VALUE 
1 1 VALUE_6 
2 1 VALUE_5 
3 1 VALUE_5 

甚至更​​好:

Pre VALUE 
1 1 6 
2 1 5 
3 1 5 

我知道這存在:Recoding dummy variable to ordered factor

但是,當我嘗試在後使用的代碼,我收到以下錯誤:

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? 

任何幫助,將不勝感激

回答

5

一個快速的解決辦法是像

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,如果你想要的列的實際名稱(由@BondedDust尖的),你可以使用相同的方法來提取它們

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

OR您可以通過以下方式使用自己的which戰略

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

OR你可以(順便說一句,which在使用apply與1就可以了保證金矢量所以沒有必要)做matrix乘法(由@akrun貢獻)

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

工作就像一個魅力。謝謝 – Sky