2017-03-05 5 views
0

데이터를 처음 서브 세트 한 후에 집계해야하는 백만 개의 레코드가있는 데이터 세트가 있습니다. 이 경우 표본 크기가 다소 커서 좋은 재현성 샘플을 제공하기가 어렵지만 어쨌든 시도 할 것입니다.dplyr의 하위 집합으로 집계

이 같은 외모와 협력하고있는 데이터의 무작위 표본 : 동일, 먼저 우리가 달에 의해 부분 집합 및 주파수 테이블을 만들어야합니다 매월에서

> df 
     auto_id user_id month 
164537 7124 240249 10 
151635 7358 226423  9 
117288 7376 172463  9 
177119 6085 199194 11 
128904 7110 141608  9 
157194 7143 241964  9 
71303  6090 141646  7 
72480  6808 175910  7 
108705 6602 213098  8 
97889  7379 185516  8 
184906 6405 212580 12 
37242  6057 197905  8 
157284 6548 162928  9 
17910  6885 194180 10 
70660  7162 161827  7 
8593  7375 207061  8 
28712  6311 176373 10 
144194 7324 142715  9 
73106  7196 176153  7 
67065  7392 171039  7 
77954  7116 161489  7 
59842  7107 162637  7 
101819 5994 182973  9 
183546 6427 142029 12 
102881 6477 188129  8 

, 거기에 많은 사용자 사용자와 (이 사용자 당 하나 명의 여행이지만, 더 큰 데이터 세트에서,이 하지의 경우 위의 무작위 표본에서, 불행하게도) 촬영 여행의 양 :

full_data <- full_data[full_data$month == 7,] 
users <- as.data.frame(table(full_data$user_id)) 
head(users) 
    Var1 Freq 
1 100231 10 
2 100744 17 
3 111281 1 
4 111814 2 
5 113716 3 
6 117493 3 

우리가 할 수있는 전체 데이터 세트에서 월별로보기 7 월 7 일 (월 = 7), 사용자는 여러 번 여행했습니다. 이제 중요한 부분 - topten - -이다

tenPercent = round(nrow(users)/10) 
users <- users[order(-users$Freq),] 
topten <- head(users, n = tenPercent) 

지금 새로운 dataframe이 (Freq의 측면에서 상위 10 %)이 사용자의 상위 10 %가 하위 집합으로 요약 할 수 있으며, 우리는 양을 얻을 사용자

출력이

> output 
    month trips 
1  7 12147 
2  8 ... 
3  9 ... 
4  10 ... 
5  11 ... 
6  12 ... 

과 같아야 결국

sum(topten$Freq) 
[1] 12147 

의 상위 10 %의 촬영 여행를 사용하여이 프로세스를 자동화 할 수있는 방법이 있나요- 특히 상위 10 %의 하위 집합을 의미합니까? 시도했습니다

output <- full_data %>% 
+  group_by(month) %>% 
+  summarise(n = n()) 

그러나 이것은 월별 총 이동 수만 합계합니다. 누군가가 dplyr의 쿼리에이 부분을 통합하는 방법을 제안 할 수 있습니까? :

tenPercent = round(nrow(users)/10) 
users <- users[order(-users$Freq),] 
topten <- head(users, n = tenPercent) 

답변

1

코드는 아래의 각 month의 각 user_id에 대한 행의 수를 계산 한 다음 각 달에 가장 열을 사용자의 10 %를 선택하고 합계를 구합니다. 그것이 당신의 문제를 해결하는지 알려주세요.

library(dplyr) 

full_data %>% group_by(month, user_id) %>% 
    tally %>% 
    group_by(month) %>% 
    filter(percent_rank(n) >= 0.9) %>% 
    summarise(n_trips = sum(n)) 

는 UPDATE :는 귀하의 의견에까지 이어의 일부 가짜 데이터를 체크 할 수 있습니다. 아래에는 user_id의 30 가지 값과 총 10,000 개의 행이 있습니다. 또한 인수를 사용하여 user_id이 선택 될 확률이 값에 비례합니다 (즉, user_id 1이 선택 될 가능성이 가장 적고 user_id 30이 가장 많이 선택됩니다).

set.seed(3) 
full_data = data.frame(user_id=sample(1:30,10000, replace=TRUE, prob=1:30), 
         month=sample(1:12, 10000, replace=TRUE)) 

는 이제 month==1user_id에 대한 행 수로 살펴 보자. 아래 코드는 각각 user_id에 대한 행 수를 계산하고 가장 일반적인 것부터 가장 일반적인 것까지 정렬합니다. user_id (28,29,26)의 세 가지 가장 일반적인 값은 171 행 (60 + 57 + 54)으로 구성됩니다.
month user_id n 
1  1  28 60 
2  1  29 57 
3  1  26 54 
4  1  30 53 
5  1  27 49 
6  1  22 43 
7  1  21 41 
8  1  20 40 
9  1  23 40 
10  1  24 38 
11  1  25 38 
12  1  19 37 
13  1  18 33 
14  1  16 28 
15  1  15 27 
16  1  17 27 
17  1  14 26 
18  1  9 20 
19  1  12 20 
20  1  13 20 
21  1  10 17 
22  1  11 17 
23  1  6 15 
24  1  7 13 
25  1  8 13 
26  1  4 9 
27  1  5 7 
28  1  2 3 
29  1  3 2 
30  1  1 1 

full_data %>% filter(month==1) %>% 
    group_by(month, user_id) %>% 
    tally %>% 
    arrange(desc(n)) %>% as.data.frame 
그래서 이제 다음 단계를 취할 수 있도록 사용자의 상위 10 %를 선택 user_id 30 개 다른 값이 있기 때문에 상위 세 사용자는 상위 10 사용자의 %를 나타냅니다. 귀하의 의견에 질문에 대답을 n (각 user_id에 대한 행의 수)의 값을 기준으로 filter(percent_rank(n) >= 0.9)user_id의 상위 10 % 만 유지합니다. percent_rank은 넥타이 처리 방법이 다른 dplyr의 여러 순위 함수 중 하나입니다 (예상 결과를 얻지 못하는 이유 일 수 있음). 자세한 내용은 ?percent_rank를 참조하십시오

full_data %>% filter(month==1) %>% 
    group_by(month, user_id) %>% 
    tally %>% 
    group_by(month) %>% 
    filter(percent_rank(n) >= 0.9) 
month user_id  n 
1  1  26 54 
2  1  28 60 
3  1  29 57 

그리고 n (상위 10 %가 여행의 총 수)의 합은 다음과 같습니다

full_data %>% filter(month==1) %>% 
    group_by(month, user_id) %>% 
    tally %>% 
    group_by(month) %>% 
    filter(percent_rank(n) >= 0.9) %>% 
    summarise(n_trips = sum(n)) 
month n_trips 
1  1  171 

그래서 코드는 우리가 순진하게 기대하는 바를 수행하지만, 문제는 타이가 처리되는 방식과 관련이 있습니다. 실제 데이터에서 여전히 변칙적 인 결과를 얻고 있거나 내가 성취하고자하는 것을 오해 한 경우 알려주십시오.

+0

시도해 주셔서 감사합니다. 대답은 약간 벗어났습니다 (약 1000 번 또는 예상보다 적음),'filter (percent_rank (n)> = 0.9)는 어떻게 작동합니까? –

관련 문제