我们可以将case_when
与quantile
函数一起使用,以将数据分为几组。将其与mtcars
列上的内置mpg
数据集一起使用。
library(dplyr)
mtcars %>%
mutate(group = case_when(mpg < quantile(mpg,0.5) ~ 'low',between(mpg,quantile(mpg,0.5),0.75))~'med',TRUE ~ 'high'))
# mpg cyl disp hp drat wt qsec vs am gear carb group
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 med
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 med
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 med
#4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 med
#5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 low
#6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 low
#7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 low
#8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 high
#....
,
我建议cut
在这里更合适。它仅计算一次分位数,不进行逐行比较(例如case_when
),并且不嵌套-ifelse
。
quantile(mtcars$disp,c(0,0.5,0.75,1))
# 0% 50% 75% 100%
# 71.1 196.3 326.0 472.0
mtcars %>%
mutate(lev = cut(disp,c(-Inf,quantile(disp,1))[-1]),label=c("low","med","high"))) %>%
select(disp,lev)
# disp lev
# 1 160.0 low
# 2 160.0 low
# 3 108.0 low
# 4 258.0 med
# 5 360.0 high
# 6 225.0 med
# 7 360.0 high
# 8 146.7 low
# 9 140.8 low
# 10 167.6 low
# 11 167.6 low
# 12 275.8 med
# 13 275.8 med
# 14 275.8 med
# 15 472.0 high
# 16 460.0 high
# 17 440.0 high
# 18 78.7 low
# 19 75.7 low
# 20 71.1 low
# 21 120.1 low
# 22 318.0 med
# 23 304.0 med
# 24 350.0 high
# 25 400.0 high
# 26 79.0 low
# 27 120.3 low
# 28 95.1 low
# 29 351.0 high
# 30 145.0 low
# 31 301.0 med
# 32 121.0 low
-Inf
的使用是因为cut
通常是左开的,而唯一的选择是右开的(因此,将省略min或max ...,所以我替换了最小值,且应低于实际值。
,
这就是cut()
的目的。示例:
res <- cut(iris$Sepal.Length,breaks=c(0,quantile(iris$Sepal.Length)),labels=seq(0,1,.25))
head(res)
# [1] 0.25 0.25 0.25 0.25 0.25 0.5
# Levels: 0 0.25 0.5 0.75 1
本文链接:https://www.f2er.com/3169085.html