如何编写一个函数,其输入是一个向量,输出是一个基于分位数信息的字符向量
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.
我正在编写一个函数,其输入是向量,输出是三个级别的字符向量:低于平均水平、平均水平和高于平均水平。我希望根据给定向量的第一个和第三个分位数来计算字符向量。当我调用我的函数时,只有 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.