2014-09-10 7 views
7

Załóżmy, że mam następujące dane:Zastosowanie dplyr :: percent_rank(), aby obliczyć szeregi percentylowe ramach grupy

id grpvar1 grpvar2 value 
1  1   3   7.6 
2  1   2   4 
... 
3  1   5   2 

dla każdego id chcę obliczyć percent_rank() ITS value w grupie określonej przez połączenie z grpvar1 i grpvar2.

Korzystanie data.table, pójdę (zakładając, że moje dane są w data.frame nazywa dataf:

library(data.table) 

# Make dataset into a data.table. 
dt <- data.table(dataf) 

# Calculate the percentiles. 
dt[, percrank := rank(value)/length(value), by = c("grpvar1", "grpvar2")] 

Jaki jest odpowiednik w dplyr

+2

Mogłabyś spróbuj: 'dataf%>% group_by (grpvar1, grpvar2)%>% mutate (percrank = ranga (wartość)/długość (wartość))' co daje wynik, który pokazałeś używając 'data.table' – akrun

+2

Nie ma prawdziwego powodu, aby używać 'dplyr :: percent_rank()', ponieważ jest to prosta funkcja, która wykonuje '(min_rank (x) - 1)/(length (x) - 1)'. Łatwiej jest napisać 'rank (value)/length (value)' niż próbować zaadoptować 'percent_rank' do twoich potrzeb –

+1

Akrun, zawiń to w odpowiedź, a sprawdzę to, gdy potwierdzę, że działa zgodnie z przeznaczeniem! –

Odpowiedz

6

Spróbuj:?

library(dplyr) 
dataf %>% 
group_by(grpvar1, grpvar2) %>% 
mutate(percrank=rank(value)/length(value)) 
+0

Prawdopodobnie będzie to bardzo powolne, jeśli zostanie wykonany zewnętrzny zestaw danych w bazie danych Postgres z milionami, jeśli wiersze i dziesiątki tysięcy grup są prawidłowe? –

+1

@Brash Equilibrium Tak, zgadzam się. Jeśli zbiór danych jest możliwy do opanowania, "data.table" będzie szybszą opcją. – akrun

+0

Zestaw danych nie jest możliwy do opanowania, jeśli wprowadzę go wszystkie naraz. Będę musiał przynieść tylko te rzeczy, których potrzebuję do zrobienia w rankingu, a następnie wyjąć śmieci po kroku agregacji po rankingu. –

Powiązane problemy