在R中收集多个虚拟变量作为一个分类变量

时间:2018-11-15 16:48:01

标签: r if-statement reshape

我知道this solution,但是我很难将其应用于不仅是虚拟变量的数据。

要加载的一些示例代码,基本上来自一系列费用

df <- data.frame(Charge = c(12,4,6,10,5,9), Groceries = c(1,0,0,0,0,0),Utilities = c(0,1,0,0,0,0),Consumables = c(0,0,1,0,0,0), Transportation = c(0,0,0,1,0,0),Entertainment = c(0,0,0,0,1,0),Misc = c(0,0,0,0,0,1))

我想创建一个新的变量“ Category”,该变量采用当前编码为二进制的列名。我可以使用ifelse做到这一点,但我正在寻找更通用的解决方案,例如从重塑包装中取出。

当前,我只能使用以下方法解决此问题:

df$Category <- ifelse(df$Groceries==1, "Groceries", 

                                ifelse(df$Utilities==1,"Utilities",
                                       ifelse(df$Consumables==1,"Consumables",
                                              ifelse(df$Transportation==1,"Transportation",
                                                     ifelse(df$Entertainment==1,"Entertainment","Misc")))))

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果始终为1,并且未在单行中重复,则使用max.col返回该行中最大值的索引,并使用该索引将names的子集数据集

df$Category <- names(df)[-1][max.col(df[-1])]
df$Category
#[1] "Groceries"      "Utilities"      "Consumables"    "Transportation" "Entertainment"  "Misc"