遍历各列,然后遍历各行,以将某些数字更改为零,条件是每列变量的长度为

时间:2019-06-20 20:49:22

标签: r loops conditional-statements

enter image description here我需要遍历565列数据,每列包含与类别或金额有关的数字,并且变量的长度不同,即一列包含0-9,其中6到9是分类的和0-5是金额,相邻的列包含0-999,其中996,997,998和999是类别(无帐户,已关闭帐户等),并且只有0-992是月龄。我需要将任何“分类”数字更改为零,而只保留“值”。

我尝试遍历列和行,检查列中变量的最大长度,以确定其所在的“类别”,然后将“类别”数字更改为0。但是,当我运行时以下,它根本不会改变我的数据。我还希望能够在每列旁边添加一列,以指示变量类别,但目前已将其注释掉。

splitcode <-函数(数据){

    for ( i in ncol(data)){
      col <- data[,i]
      max_length <- max(nchar(col))

      for ( j in nrow(data)){
        val <- data[j,i]

          if( max_length == 1){
            ifelse(val > 5, 0,val)
            }
            #data$attribute_type[i] <- 'Amount'

          if( max_length == 2){
            ifelse(val > 92, 0, val)
            }
            #data$attribute_type[i] <- 'Number of Accounts'

          if( max_length == 3){
            ifelse(val > 992, 0, val)
          }
            #data$attribute_type[i] <- 'Age in Months'

          if(  max_length == 4){
            ifelse(val > 9992, 0, val)
          }
             #data$attribute_type[i] <- 'Age in Months'

          if(  max_length == 7){
            ifelse( val > 9999992, 0, val)
            #data$attribute_type[i] <- 'Total Balance'
          }

          else{
            #then we know you're a percentage
            ifelse(val > 1, 0, val)
            #data$attribute_type[i] <- 'Percentage'
          }
        }
    }
    return(data)
  }

我没有收到任何错误消息,但是返回的数据为null或不变。我希望返回的数据集是更新的0值

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow。

由于您仅提供数据图片,因此其他人很难看到实际情况。但是,鉴于您要使用的数据是实数(双精度或整数而不是因子或字符),那么您的代码就可以工作-您唯一要做的就是将其分配给对象,例如数据。框架。

您遍历了数据,但是您对输出不执行任何操作。例如,您可以不用写ifelse(val > 1, 0, val)来写 data[j,i] <- ifelse(data[j,i] > 1, 0, data[j,i])。这里重要的是赋值运算符<-

但是,以这种方式更改数据不太像R。通常,使用ifelse之类的矢量化函数时,仅在列上工作就足够了。

以下是解决您的问题的dplyr解决方案。

# load the package
library("dplyr")

# some test data, a column with max(nchar(x)==2
test_tbl <- tibble( a = c(0,0,1,99,3,4,99))


test_tbl <- test_tbl %>% # overwrite test data the following way
               # mutate (change) a column, if it has max 2 charaters
               mutate_if(~ max(nchar(.x))==2, 
               # sql-like case_when corresponds to your ifelse-statements
                         ~ case_when(.x > 92 ~ 0, 
                                     TRUE    ~ .x) 
                        ) # closes mutate_if

希望这对您的数据有用!