2016-06-27 1 views
3

je la trame de données suivante:comment filtrer top 10 percentile d'une colonne dans un groupe de trames de données par identifiant en utilisant dplyr

id total_transfered_amount day 
1  1000     2 
1  2000     3 
1  3000     4 
1  1000     1 
1  10000    4 
2  5000     3 
2  6000     4 
2  40000    2 
2  4000     3 
2  4000     3 
3  1000     1 
3  2000     2 
3  3000     3 
3  30000    3 
3  3000     3 

nécessité de filtrer les lignes qui se situent au-dessus de 90 centiles dans la colonne « total_transfered_amount » pour chaque id paquet utilisant séparement dplyr preferabely, par exemple, je dois filtrer les lignes suivantes:

2  40000    2 
3  30000    3 
+0

@akrun apprécient votre idée – sanaz

+0

@DatamineR apprécie votre aide – sanaz

+0

@ Mateusz1981 je doute sample_frac fonctionne basé sur le concept de percentile, ne veut pas échantillonner la colonne, je veux garder 90 percentile et se débarrasser des lignes qui faussent dans le top 10 percentile – sanaz

Répondre

1

Nous pouvons utiliser data.table

library(data.table) 
setDT(df1)[,.SD[quantile(total_transfered_amount, 0.9) < 
       total_transfered_amount] , by = id] 
# id total_transfered_amount day 
#1: 1     10000 4 
#2: 2     40000 2 
#3: 3     30000 3 

Ou nous pouvons utiliser base R

df1[with(df1, as.logical(ave(total_transfered_amount, id, 
       FUN=function(x) quantile(x, 0.9) < x))),] 
# id total_transfered_amount day 
#5 1     10000 4 
#8 2     40000 2 
#14 3     30000 3 
+0

oui correct, que se passe-t-il si nous voulons le conserver en tant que trame de données et utiliser dplyr? – sanaz

+0

@sanaz le 'data.table' devrait fonctionner avec' dplyr'. Si vous avez besoin de changer à 'data.frame, utilisez' setDF (res) ' – akrun

+0

le problème est que je veux migrer le code à r étincelle alors il n'y a pas de concept data.table dans R spark encore – sanaz

0

Checkt cela. Je ne comprends pas pourquoi vous avez la première ligne de votre sortie

dane <- data.frame(id = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3,3), total_trans = c(1000, 2000, 3000, 1000, 10000, 5000, 6000, 
                          40000, 4000, 4000, 1000, 2000, 3000, 30000, 3000), 
         day = c(2, 3,4, 1, 4, 3, 4, 2, 3, 3, 1, 2, 3, 3, 3)) 

    library(dplyr) 




dane %>% group_by(id) %>% filter(quantile(total_trans, 0.9)<total_trans) 





     id total_trans day 
    (dbl)  (dbl) (dbl) 
1  1  10000  4 
2  2  40000  2 
3  3  30000  3 
+0

Edité, j'ai juste deviné que 10000 peut tomber au-dessus du 90 percentile, – sanaz

+0

ce que votre réponse est manquant je pense est qu'il calcule le percentile pour la colonne entière mais nous devons le faire séparément pour chaque groupe d'id. – sanaz

+0

ok, il suffit d'ajouter 'Group_by (factor (id))' Avant de 'muter' – Mateusz1981