【问题标题】:Subset columns if they meet a condition如果满足条件,则对列进行子集
【发布时间】:2019-03-21 18:53:51
【问题描述】:

我的任务:

  • 选择行为 0 或 1 的所有列。
  • 将所有这些列的类更改为阶乘(因为它们是二元的)。

在以下情况下,CA + CC 应更改为factorial。

CA = c(1,0,1,0,1)
CB = c(1,12,21,0,7)
CC = c(1,0,1,0,1)
mydf = data.frame(CA, CB, CC)
str(mydf)
    'data.frame':   5 obs. of  3 variables:
     $ CA: num  1 0 1 0 1
     $ CB: num  1 12 21 0 7
     $ CC: num  1 0 1 0 1

为什么?因为这些行当前被描述为integer 和number 而不是factors。而且我认为某些 ML 算法会混淆。

【问题讨论】:

    标签: r dataframe data-science


    【解决方案1】:

    dplyr's mutate_if 的另一种方法

    library(dplyr) 
    is_one_zero <- function(x) {
    
      res <- all(unique(x) %in% c(1, 0))
    
      return(res)
    }
    
    out <- mydf %>% 
      mutate_if(is_one_zero, as.factor) 
    
    str(out)
    #'data.frame':  5 obs. of  3 variables:
    # $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
    # $ CB: num  1 12 21 0 7
    # $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2
    

    【讨论】:

      【解决方案2】:

      baseR 的一种方式:

      #if all the values in a column are either 0 or 1 convert to factor
      mydf[] <- lapply(mydf, function(x) {
        if(all(x %in% 0:1)) {
          as.factor(x)
        } else {
          x
        }
      })
      

      输出:

      str(mydf)
      #'data.frame':  5 obs. of  3 variables:
      # $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
      # $ CB: num  1 12 21 0 7
      # $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2**
      

      【讨论】:

        【解决方案3】:

        在基础 R 中的另一种方式

        cols <- colSums(mydf == 0 | mydf == 1) == nrow(mydf)
        mydf[cols] <- lapply(mydf[cols], as.factor)
        
        str(mydf)
        #'data.frame':  5 obs. of  3 variables:
        # $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
        # $ CB: num  1 12 21 0 7
        # $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2
        

        【讨论】:

          猜你喜欢
          • 2015-12-09
          • 1970-01-01
          • 2017-01-13
          • 1970-01-01
          • 2022-10-07
          • 1970-01-01
          • 2017-06-23
          • 2018-12-21
          • 1970-01-01
          相关资源
          最近更新 更多