我正在创建一个根据销售情况将客户分类为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!
答案 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"))}