我想修复我的功能的行为

时间:2019-10-24 16:12:25

标签: r

我正在创建一个根据销售情况将客户分类为A,B和C三类的函数,但是该函数给了我不确定的有线结果

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 个答案:

答案 0 :(得分:2)

通过使用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)
}

答案 1 :(得分:2)

如@shwan所述,您正在将x向量重写为字符值。为了避免为结果定义另一个向量并且避免循环结构,您可以使用向量化ifelse命令并将函数编写为:

f=function(x){ifelse(x>0 & x<501,"A",ifelse(x>500 & x <1001,"B","C"))}