如何使用向量索引正确避免if-expressions?

时间:2016-06-26 13:01:32

标签: r vector

x是1到100之间的整数向量

我创建了一个函数,用于确定数字的类别:

x∈[1,20]: small
x∈[21,50]: med 
x∈[51, 100]:large

这里的功能:

x <- c(1:99)

vector.fun<-function(x){
  x[x >= 1 & x <=20] <-"small"
  x[x >= 21 & x <=50] <-"med" 
  x[x >=51 & x <=99] <-"large"
  return(x)
}
vector.fun(89)

然而正如你所看到的,在我的向量中,我的向量是1:99而不是1:100,出于某种原因,当我将其更改为:

x <- c(1:100)

    vector.fun<-function(x){
      x[x >= 1 & x <=20] <-"small"
      x[x >= 21 & x <=50] <-"med" 
      x[x >=51 & x <=100] <-"large"
      return(x)
    }
    vector.fun(100)

它无法识别最后一行中的任何数字:x[x >=51 & x <=100] <-"large"当它出现时,它会返回“med”而不是“big”。

我做错了什么?我应该在函数中进行哪些更改,以便参数中包含100并返回“large”?

1 个答案:

答案 0 :(得分:1)

这确实是上述评论中提到的强制问题。 如果要按照创建函数的方式保留函数结构,可以按如下方式更改它:

vector.fun<-function(y){
    x <- y
    x[y >= 1 & y <=20] <-"small"
    x[y >= 21 & y <=50] <-"med" 
    x[y >=51 & y <=100] <-"large"
    return(x)
}

虽然@alexis_laz建议的解决方案更简洁,更优雅:

vector.fun<-function(x){
   cut(x, c(0,20,50,100), labels = c("small", "med", "large"))
}

请记住,第二个版本将生成 factor 类型向量,而第一个版本将生成字符类型向量。