基于分位数信息,如何编写输入为向量,输出为字符向量的函数

时间:2018-11-21 10:43:45

标签: r function quantile

我正在写一个函数,其输入是向量,输出是三个级别的字符向量:低于平均,平均和高于平均。我希望根据给定向量的第一和第三分位数来计算字符向量。当我调用函数时,只有“低于平均水平”会返回,我理解为什么会返回,但不知道如何解决。理想情况下,我想要一个新的向量,使得“低于平均水平”对应于低于第一分位数的值,“高于平均水平”对应于高于第三分位数的值,而“平均水平”介于两者之间。

x<-c(1:10)
label_scale<-function(vecrr){
  lq<-quantile(vecrr,0.25)
  uq<-quantile(vecrr,0.75)
  if(vecrr<=lq){
    k<-'Below Avg.'
  } else if(vecrr>=uq){
    k<-'Above Avg.'
  } else{
    k<-'Avg.'}
  return(k)
}
y<-mapply(label_scale,x)
z<-sapply(x,label_scale)

2 个答案:

答案 0 :(得分:1)

您的问题是,将函数应用于向量的每个元素,默认情况下,给定值始终等于该值的分位数,并且过程将为每个向量返回Below Avg向量元素。 (例如x == quantile(x, 0.25)将始终返回TRUE)。

您应该在向量化的函数内部使用ifelse

# example vector
x<-c(1:10)

# function
label_scale<-function(vecrr){
  lq<-quantile(vecrr,0.25)
  uq<-quantile(vecrr,0.75)

ifelse(vecrr<=lq, 'Below Avg.', ifelse(vecrr>=uq, 'Above Avg.', 'Avg.'))  

}

# use function on a vector
label_scale(x)

# [1] "Below Avg." "Below Avg." "Below Avg." "Avg."       "Avg."       "Avg."       "Avg."       "Above Avg."
# [9] "Above Avg." "Above Avg."

答案 1 :(得分:0)

在这种情况下,我会使用分位数:

x <- c(1:10)

x.char <- cut(x, quantile(x, c(0,.25,.75,1)), include.lowest = T, labels = c('Below Avg.', 'Avg.','Above Avg.'))

x.char
[1] Below Avg. Below Avg. Below Avg. Avg. Avg. Avg. Avg.      
[8] Above Avg. Above Avg. Above Avg.
Levels: Below Avg. Avg. Above Avg.