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

How to write a function whose input is a vector and output is a character vector based on quantile information

我正在编写一个函数,其输入是向量,输出是三个级别的字符向量:低于平均水平、平均水平和高于平均水平。我希望根据给定向量的第一个和第三个分位数来计算字符向量。当我调用我的函数时,只有 Below Avg returns 我明白为什么它 returns,但不知道如何修复。理想情况下,我想要一个新向量,使得 Below Avg 对应于第一个分位数以下的值,Above Avg 对应于第三个分位数以上的值,Avg 是介于两者之间的所有值。

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)

您的问题是您将函数应用于向量的每个元素,默认情况下,给定值始终等于该值的分位数,您的过程将 return Below Avg 对于每个矢量元素。 (例如 x == quantile(x, 0.25) 将始终 return 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."

在这种情况下我会使用 cut 和 quantile:

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.