2017-06-21 2 views
2

Je veux diviser un vecteur selon données (ou seuils pauses) dans des bacs à R.R - Ordre inverse avec coupe

Cela peut se faire comme suit:

numbers <- 1:10 
cutoffs <- c(0,2,6,7,10, Inf) 

data.frame(data = numbers, bins = as.integer(cut(numbers, breaks = cutoffs, right = FALSE))) 

Cela se traduira les suivantes:

data bins 
1  1 1 
2  2 2 
3  3 2 
4  4 2 
5  5 2 
6  6 3 
7  7 4 
8  8 4 
9  9 4 
10 10 5 

Cependant, ce que je veux est pour la plus faible valeur pour être au plus haut bin et vice versa. Donc, en quelque sorte, je veux réaliser ce qui suit à la place:

data bins 
1  1 5 
2  2 4 
3  3 4 
4  4 4 
5  5 4 
6  6 3 
7  7 2 
8  8 2 
9  9 2 
10 10 1 

J'ai essayé de nombreuses combinaisons avec 'rev() pour inverser la séquence. Mais gardez à l'esprit que je ne peux pas simplement inverser les résultats de la commande précédente, car ils sont asymétriques.

Je me rends compte qu'il pourrait y avoir une solution simple à cela, mais pour une raison quelconque, il ne cesse de me échapper. Des suggestions dans quelle direction je devrais regarder?

+6

Couldn » t vous soustrayez les «bacs» d'origine de 6? –

+1

vous pourriez utiliser l'argument 'labels' ..' as.integer (as.character (couper (nombres, sauts = seuils, étiquettes = 5: 1, droite = FAUX))) ' – user20650

+1

@db que .. fait l'affaire .. Merci pour ça! J'étais trop concentré sur l'utilisation de la coupe seule pour cela que j'ai oublié quelque chose d'aussi simple que ça. –

Répondre

3

Puisque vous vouliez les limites d'intervalle laissé fermé et je voulais un résultat entier, alors findInterval (plutôt que cut) est le choix naturel:

data.frame(data = numbers, bins = 6L - findInterval(numbers, vec = cutoffs)) 
    data bins 
1  1 5 
2  2 4 
3  3 4 
4  4 4 
5  5 4 
6  6 3 
7  7 2 
8  8 2 
9  9 2 
10 10 1 
> 
+0

Merci, votre réponse fait aussi l'affaire. Exactement ce dont j'avais besoin! –

+1

Et si vous vouliez le rendre programmatique, vous pourriez substituer l'expression max() pour le '6L'. –

4

Changer les arguments de la fonction coupe() en inversant le dataframes et le réglage de la valeur de droite = TRUE, de sorte que l'intervalle devient (-inf, 0].

Le résultat souhaité est obtenu.

data.frame(data = numbers, bins = as.integer(cut(-numbers, breaks = -cutoffs, right = TRUE))) 
+0

Une bonne réponse aussi, merci pour cela. J'ai accepté l'autre parce qu'il est un peu plus facile à lire pour moi (comme nous l'utilisons ici la double négation). –