2016-06-26 22 views
0

x是整数范围在1到100如何通过使用向量索引正确地避免if-expressions?

之间

我创建确定在哪个类别的数是一个函数的向量:

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”而不是“large”,因为它应该是。

我做错了什么?我应该在我的函数中做哪些修改,以便将100包含在参数中并返回“大”?

+0

强制是一个可能的罪魁祸首 – Khashaa

+0

您的函数参数与您的原始向量相同。函数外部的矢量从不使用。 – Psidom

+4

第一次用'small'替换'x'中的索引,'x'被强制为“character”,并且以'c(“1”,“50”,“60”)> =“ 51“'和'c(”1“,”50“,”60“)<=”100“',这可能与它们的”数字“等同。相反,对于这样的问题,使用'cut(x,c(0,20,50,100),labels = c(“small”,“med”,“large”))' –

回答

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

保持记住,这第二个版本会产生一个因子类型向量,而第一个版本会产生一个字符类型向量。

+0

感谢:P现在有道理。 – AP77

相关问题