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