【问题标题】:Gathering multiple dummy variables as one categorical variable in R在R中收集多个虚拟变量作为一个分类变量
【发布时间】:2018-11-15 16:48:01
【问题描述】:

我知道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 做到这一点,但我正在寻找更通用的解决方案,例如从 reshape 包中取出。

目前,我只能通过以下方式解决此问题:

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")))))

【问题讨论】:

    标签: r if-statement reshape


    【解决方案1】:

    如果总是有一个 1 并且它不在单行中重复,则使用 max.col 返回该行中最大值的索引,并使用该索引对数据集的 names 进行子集化

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

    【讨论】:

    • 谢谢,这行得通。一个跟进,说 df 在虚拟变量之后有额外的行(例如日期),我将如何索引我想要使用的列?而不是计算一个特定的范围,例如 [2:6]?
    • @Aaron 是的,您可以根据数字或列名进行子集化。在这种情况下,它将是 2:6
    猜你喜欢
    • 1970-01-01
    • 2020-08-02
    • 2012-01-15
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2021-07-27
    • 2015-08-02
    相关资源
    最近更新 更多