web-dev-qa-db-fra.com

Catégoriser la variable continue avec dplyr

Je veux créer une nouvelle variable avec 3 catégories arbitraires basées sur des données continues.

set.seed(123)
df <- data.frame(a = rnorm(100))

En utilisant la base je voudrais

df$category[df$a < 0.5] <- "low"
df$category[df$a > 0.5 & df$a < 0.6] <- "middle"
df$category[df$a > 0.6] <- "high"

Existe-t-il une solution pour cela, je suppose mutate()?

En outre, existe-t-il un moyen de calculer les catégories plutôt que de les choisir? C'est à dire. Laissons R calculer où devraient être les pauses pour les catégories.

MODIFIER

La réponse est dans ce fil , cependant, cela n'implique pas d'étiquetage, ce qui m'a confondu (et peut dérouter les autres), donc je pense que cette question sert à quelque chose.

19
FilipW

Pour convertir du numérique en catégorique, utilisez cut. Dans votre cas particulier, vous voulez:

df$category <- cut(df$a, 
                   breaks=c(-Inf, 0.5, 0.6, Inf), 
                   labels=c("low","middle","high"))

Ou, en utilisant dplyr:

library(dplyr)
res <- df %>% mutate(category=cut(a, breaks=c(-Inf, 0.5, 0.6, Inf), labels=c("low","middle","high")))
##               a category
##1   -0.560475647      low
##2   -0.230177489      low
##3    1.558708314     high
##4    0.070508391      low
##5    0.129287735      low
## ...
##35   0.821581082     high
##36   0.688640254     high
##37   0.553917654   middle
##38  -0.061911711      low
##39  -0.305962664      low
##40  -0.380471001      low
## ...
##96  -0.600259587      low
##97   2.187332993     high
##98   1.532610626     high
##99  -0.235700359      low
##100 -1.026420900      low
24
aichao

en utilisant quantiles pour cut

xs=quantile(df$a,c(0,1/3,2/3,1))
xs[1]=xs[1]-.00005
df1 <- df %>% mutate(category=cut(a, breaks=xs, labels=c("low","middle","high")))
boxplot(df1$a~df1$category,col=3:5)

enter image description here

3
Robert