Я хочу исправить поведение моей функции - PullRequest
0 голосов
/ 24 октября 2019

Я делаю функцию, которая классифицирует клиентов на основе их продаж по 3 классам А, В и С, но эта функция дает мне проводные результаты, я не знаю, почему

f <- function(x)
{
  for(j in 1:length(x))
  {


      if(x[j] > 0 & x[j] < 501 )
      {
        x[j] = "C"
      }

      else if(x[j] > 500 & x[j] < 1001 )
      {
        x[j] = "B"
      }

      else if(x[j] > 1000  )
      {
        x[j] = "A"
      }

  }
return(x)
  }

Этофункция.

print(f(c(2000,2000,2000)))

когда я запускаю это, например, это дало мне A, C, C, где должно быть все A

print(f(c(600,600)))

это дало B, что верно, но тогда A!

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Как заметил @shwan, вы переписывали вектор x как символьные значения. Чтобы избежать определения другого вектора для результата, а также избежать структуры цикла, вы можете просто использовать команду vectorized ifelse и написать свою функцию в виде:

f=function(x){ifelse(x>0 & x<501,"A",ifelse(x>500 & x <1001,"B","C"))}
2 голосов
/ 24 октября 2019

Используя x[j] = "C", вы приводите x к классу 'персонаж', который затем возвращает неожиданные логические сравнения.

Вам необходимо сохранить результат в каком-то другом символьном векторе ('ret'ниже).

f <- function(x) {

    ret <- NA_character_
    for(j in 1:length(x)) {
        if(x[j] > 0 & x[j] < 501 )  {
            ret <- c(ret,"C")
        } else if(x[j] > 500 & x[j] < 1001 ) {
            ret <- c(ret,"B")
        } else if(x[j] > 1000  ) {
            ret <- c(ret,"A")
        }
    }
    ret <- ret[2:length(ret)] # remove the first element
    return(ret)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...