【问题标题】:Applying condition to multiple columns in R将条件应用于 R 中的多个列
【发布时间】:2015-12-28 09:16:21
【问题描述】:

我有一个数据集,它以虚拟变量的形式代表每个客户的购物篮。

例如:

P1  P2  P3  P4  P5
0   2   0   0   0
0   1   0   0   0
0   0   0   3   0 
0   0   0   0   0
0   0   5   0   0
1   1   0   0   0

其中 P1 代表产品 1,依此类推。

基本上,我想运行一个简单的查询,我可以在其中将所有大于 1 的值转换为 1。这样我的数据中将只有 1 和 0。我可以使用以下方法完成几行:

df[(df$P1>1] <- 1

有apply all功能吗?

【问题讨论】:

    标签: r market-basket-analysis dummy-variable


    【解决方案1】:

    您可以通过+ 包装转换为逻辑矩阵并强制转换为二进制。

    +(df > 0)
    #     P1 P2 P3 P4 P5
    #[1,]  0  1  0  0  0
    #[2,]  0  1  0  0  0
    #[3,]  0  0  0  1  0
    #[4,]  0  0  0  0  0
    #[5,]  0  0  1  0  0
    #[6,]  1  1  0  0  0
    

    或者使用稍慢的ifelse

    ifelse(df > 0, 1, 0)
    

    如果数据集真的很大,创建matrix 可能不会节省内存。我们可以转换为data.table(假设初始数据集为data.frame)并使用set将值更改为1

    library(data.table)
    setDT(df)
    for(j in seq_along(df)){
      set(df, i= which(df[[j]] > 1), j=j, value=1)
     }
    
    df
    #   P1 P2 P3 P4 P5
    #1:  0  1  0  0  0
    #2:  0  1  0  0  0
    #3:  0  0  0  1  0
    #4:  0  0  0  0  0
    #5:  0  0  1  0  0
    #6:  1  1  0  0  0
    

    【讨论】:

      【解决方案2】:

      这应该与您尝试的方式相同:

      df[df > 0] <- 1
      df
        P1 P2 P3 P4 P5
      1  0  1  0  0  0
      2  0  1  0  0  0
      3  0  0  0  1  0
      4  0  0  0  0  0
      5  0  0  1  0  0
      6  1  1  0  0  0
      

      【讨论】:

        【解决方案3】:

        为什么不和class一起玩呢:

        `class<-`(!!df, "numeric")
        
        #     P1 P2 P3 P4 P5
        #[1,]  0  1  0  0  0
        #[2,]  0  1  0  0  0
        #[3,]  0  0  0  1  0
        #[4,]  0  0  0  0  0
        #[5,]  0  0  1  0  0
        #[6,]  1  1  0  0  0
        

        【讨论】:

          猜你喜欢
          • 2021-02-10
          • 1970-01-01
          • 1970-01-01
          • 2016-06-20
          • 1970-01-01
          • 1970-01-01
          • 2018-10-05
          • 2021-12-07
          • 2015-04-11
          相关资源
          最近更新 更多