J'ai un grand vecteur entier (une partie des données ci-dessous):

a <- c(0,0,0,1,1,2,2,2,4,4,7,7,7,35,50,50, 200,200,500,500,500, 2500,2501,2502,2502)

Je voudrais créer un autre vecteur (vecteur b) qui catégorise le vecteur a valeurs dans des bacs. Les valeurs de catégorie doivent être 1 pour le vecteur a valeurs 0 - 6, 2 pour 7 - 13, 3 pour 14 - 20 ...

Je sais que je peux utiliser la fonction dplyr case_when() pour muter, mais lorsque les données sont volumineuses, cela peut ne pas être efficace.

0
BMM 6 févr. 2020 à 22:43

1 réponse

Meilleure réponse

La meilleure façon de classer les données numériques dans des plages avec une valeur de sortie numérique est la fonction findInterval. Exemples:

> a <- c(0,0,0,1,1,2,2,2,4,4,7,7,7,35,50,50, 200,200,500,500,500, 2500,2501,2502,2502)
> findInterval( a, c(0, 6, 12, 18, 24))
 [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 5 5 5 5 5 5 5 5 5 5 5 5
> findInterval( a, 6^(0:6))
 [1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 5 5 5 5
> 6^(0:6)
[1]     1     6    36   216  1296  7776 46656

Notez que la valeur renvoyée pour les éléments en dessous de la valeur min dans le deuxième argument est 0 et la valeur pour les éléments au-dessus du max est la longueur du vecteur vec (c'est-à-dire les ruptures). Les intervalles sont fermés à gauche, ouverts à droite, ce qui est à l'opposé du comportement de la fonction cut (sauf si modifié par des paramètres).

3
IRTFM 6 févr. 2020 à 19:58