Comment partitionner lors du classement sur une colonne particulière?
Tous:
J'ai un bloc de données comme la suivre.Je sais que je peux faire global rang de commande comme ceci:
dt <- data.frame(
ID = c('A1','A2','A4','A2','A1','A4','A3','A2','A1','A3'),
Value = c(4,3,1,3,4,6,6,1,8,4)
);
> dt
ID Value
1 A1 4
2 A2 3
3 A4 1
4 A2 3
5 A1 4
6 A4 6
7 A3 6
8 A2 1
9 A1 8
10 A3 4
dt$Order <- rank(dt$Value,ties.method= "first")
> dt
ID Value Order
1 A1 4 5
2 A2 3 3
3 A4 1 1
4 A2 3 4
5 A1 4 6
6 A4 6 8
7 A3 6 9
8 A2 1 2
9 A1 8 10
10 A3 4 7
Mais comment puis-je définir un ordre de classement pour un ID particulier au lieu d'un ordre mondial. Comment puis-je obtenir ce fait? En T-SQL, nous pouvons le faire que la syntaxe suivante:
RANK() OVER ( [ < partition_by_clause > ] < order_by_clause > )
Une idée?
source d'informationauteur RobinMin
Vous devez vous connecter pour publier un commentaire.
Mon chemin, mais il y a probablement mieux. Jamais utilisé rang, din, sans même le savoir. Merci, peut être utile.
Rendements:
EDIT:
Si vous n'avez pas de soins sur la préservation de l'ordre original des données puis cela fonctionne avec moins de code:
De nombreuses options.
À l'aide de
ddply
de la plyr package:Ou si la performance est un problème (c'est à dire de données très volumineux) à l'aide de la de données.tableau package:
ou dans tout son détail sanglant d'une base de R solution à l'aide de
split
lapply
do.call
etrbind
:Ici sont un couple d'approches:
ave Cela prend chaque ensemble de numéros de Valeur qui ont le même ID et applique le rang séparément pour chaque série. Pas de paquets sont utilisés.
:
Noter que la solution ci-dessus conserve l'original de la ligne de commande. Il pourrait être réglé par la suite si cela était souhaité.
sqldf avec RPostgreSQL
Cette solution réorganise les lignes. Il est supposé que c'est ok depuis votre exemple est la solution n'a que (mais si pas d'ajouter un numéro de séquence de la colonne de
dt
et ajouter une clause order by pour re-commander le résultat dans le numéro de séquence de la commande).Vous pouvez utiliser les données.table d'emballage.
setDT(dt)
dt[, Order := rank(Value, ties.method = "first"), by = "ID"]
dt <- as.data.frame(dt)
donnant à la sortie désirée: