Цикл по столбцам, а затем по строкам, чтобы изменить некоторые числа на нули, при условии длины переменной на столбец - PullRequest
0 голосов
/ 20 июня 2019

введите описание изображения здесь Мне нужно просмотреть 565 столбцов данных, каждый из которых содержит числа, относящиеся к категории или количеству, и переменные имеют разную длину, т. Е. Один столбец содержит 0-9, сС 6 по 9, являющиеся категориальными, а 0-5 - суммами, соседний столбец содержит 0-999, причем 996,997,998 и 999 - категории (нет счета, закрытый счет и т. Д.), И только 0-992 - возраст в месяцах.Мне нужно изменить любое «категорическое» число на ноль, оставив только «значения».

Я попытался перебирать столбцы и строки, проверяя максимальную длину переменных в столбце, чтобы определить, какую «категорию»он находится внутри, затем изменяет все, что является номером категории, на 0. Однако, когда я запускаю следующее, это не меняет мои данные вообще.Я также хотел бы иметь возможность добавлять столбец рядом с каждым столбцом, указывающий категорию переменной, но это пока закомментировано.

splitcode <- функция (данные) {</p>

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

Я не получаю сообщений об ошибках, но возвращаемые данные являются нулевыми или неизменными.Я хочу, чтобы возвращенный набор данных был обновлен 0 значений

1 Ответ

0 голосов
/ 24 июня 2019

Добро пожаловать в StackOverflow.

Поскольку вы предоставляете только изображение своих данных, другим трудно увидеть, что на самом деле происходит.Но, учитывая, что данные, с которыми вы работаете, являются действительными числами (двойными числами и / или целыми числами, а не коэффициентами или символами), тогда ваш код будет работать - единственное, что вам нужно сделать, это присвоить его объекту, например данным.frame.

Вы перебираете данные, но ничего не делаете с выводом.Например, вместо написания 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

Надеюсь, это работает для вас.данные!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...