R中的单个分类变量(因子)的虚拟变量

Sky*_*Sky 6 r factors

我有一组编码为二项式的变量.

   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           
Run Code Online (Sandbox Code Playgroud)

我想将变量(VALUE_1,VALUE_2 ... VALUE_8)合并为一个单独的有序因子,同时保留列(Pre),因为数据看起来像这样:

  Pre VALUE
1  1  VALUE_6
2  1  VALUE_5
3  1  VALUE_5
Run Code Online (Sandbox Code Playgroud)

甚至更好:

  Pre VALUE
1  1  6
2  1  5
3  1  5
Run Code Online (Sandbox Code Playgroud)

我知道这存在:将虚拟变量重新编码为有序因子

但是,当我尝试该帖子中使用的代码时,我收到以下错误:

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?
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

Dav*_*urg 6

一个快速的解决方案就是这样的

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
Run Code Online (Sandbox Code Playgroud)

或者如果你想要列的实际名称(由@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
Run Code Online (Sandbox Code Playgroud)

或者您可以通过which以下方式使用自己的策略(顺便说一句,which是矢量化的,所以不需要使用apply1的边距)

cbind(df[1], VALUE = factor(which(df[-1] == 1, arr.ind = TRUE)[, 2], ordered = TRUE))
Run Code Online (Sandbox Code Playgroud)

或者你可以做matrix乘法(由@akrun提供)

cbind(df[1], VALUE = factor(as.matrix(df[-1]) %*% seq_along(df[-1]), ordered = TRUE))
Run Code Online (Sandbox Code Playgroud)