首页 > 解决方案 > 如何根据分位数信息编写输入为向量输出为字符向量的函数

问题描述

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

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)

标签: rfunctionquantile

解决方案


您的问题是您将函数应用于向量的每个元素,并且默认情况下,给定值始终等于该值的分位数,并且您的过程将为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."

推荐阅读