突变问题以在三类中标记数据

我有数字格式的数据,我想根据它们的分位数将它们标记为三个级别-“低”,“中”,“高”

  1. 低,
  2. med,50%
  3. 高,> 75%的百分位数

这是我的R输出

 quantile(data$crim)
       0%       25%       50%       75%      100% 
 0.006320  0.082045  0.256510  3.677083 88.976200 

我使用mutate标记它们,以下是我的R代码。我对所有数据都表示“很高”。

 newdata<-mutate(data,crim.lev = ifelse(crim %in% 0:0.26,"low",ifelse(crim %in% 0.27:3.68,"med","high")))

请让我错过的任何内容或其他方法来完成此操作。谢谢。

rxf_sy 回答:突变问题以在三类中标记数据

我们可以将case_whenquantile函数一起使用,以将数据分为几组。将其与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

大家都在问