2017-02-15 4 views
0

다음과 같은 데이터 프레임이 있습니다 (df). 여기백분위 수를 찾고 R을 그룹화하는 방법

day area hour time count 
___ ____ _____ ___ ____ 
1 1  0  1  10 
1 1  0  2  12 
1 1  0  3  8 
1 1  0  4  12  
1 1  0  5  15 
1 1  0  6  18 
1 1  1  1  10 
1 1  1  2  12 
1 1  1  3  8 
1 1  1  4  12  
1 1  1  5  15 
1 1  1  6  18 
1 1  1  7  12  
1 1  1  8  15 
1 1  1  9  18 
1 1  2  1  10  
1 1  2  2  18 
1 1  2  3  19 
..... 
2 1  0  1  18 
2 1  0  2  12 
2 1  0  3  18 
2 1  0  4  12  
2 1  1  1  8 
2 1  1  2  12 
2 1  1  3  18 
2 1  1  4  10  
2 1  1  5  15 
2 1  1  6  18 
2 1  1  7  12  
2 1  1  8  15 
2 1  1  9  18 
2 1  2  1  10  
2 1  2  2  18 
2 1  2  3  19 
2 1  2  4  9  
2 1  2  5  18 
2 1  2  6  9 


..... 
30 99  23  1  9  
30 99  23  2  8 
30 99  23  3  9 
30 99  23  4  19  
30 99  23  5  18 
30 99  23  6  9 
30 99  23  7  19  
30 99  23  8  8 
30 99  23  9  19 

I은 ​​당 87 개 day.So 영역 (82 다음에 I가 1이 90,93,95,97,99), 24 시간 (0 ~ 23)의 데이터에 대해 30 일 동안의 데이터를 가지고 그 지역을 가로 지르는 데 걸린 시간과 얼마나 많은 사람들이 교차했는지에 관한 것입니다. 예를 들어

는 :

day area hour time count 
___ ____ _____ ___ ____ 
1 1  0  1  10 
1 1  0  2  12 
1 1  0  3  8 
1 1  0  4  12  
1 1  0  5  15 
1 1  0  6  18 

이 시간 0에 1 일에 내가 그것을했다 얼마나 많은 시간을 계산 할 영역이 1

time count cumulative_count 
___ ___ ________________ 
1  10   10 
2  12   22 
3  8   30 
4  12   42  
5  15   57 
6  18   75 
10 vehicles crossed the area in 1 minute. 
12 vehicles crossed the area in 2 minutes. 
8 vehicles crossed the area in 3 minutes. 
12 vehicles crossed the area in 4 minutes. 
15 vehicles crossed the area in 5 minutes. 
18 vehicles crossed the area in 6 minutes. 

을 통과하는 데 걸리는 시간을 내을 제공합니다 차량의 80 %가 하루 1 시간 동안 1을 교차합니다. 총 차량 = (10 + 12 + 8 + 12 + 15 + 18) = 75이므로 75의 80 %는 60입니다. 따라서 80 % 1 시간 0시에 지역 1을 통과하는 차량 (75의 80 %는 60)은 5와 6 사이에있을 것입니다 (5에 더 가깝습니다). 그래서 결과는 같을 것이다 :

day area hour time_taken_for_80%vehicles_to_pass 
    ___ ____ ____ ___________________________________ 
    1 1  0    5.33(approximately) 
    1 1  1    7.30 
    1 1  2    2.16 
    .... 
    30 1  23    3.13 
    1 2  0    --- 
    1 2  1    --- 
    1 2  2    --- 
    1 2  3    --- 

....... 

    30 99  21    --- 
    30 99  22    --- 
    30 99  23    --- 

    I know to I have to take quantile and then group by the area and day and hour.So I tried with 

library(dplyr) 
grp <- group_by(df, day,area,hour,quantile(df$count,0.8)) 

하지만하지 work.Any 도움이 내 솔루션은 각 time을 위해, 지역을 넘어 차량의 비율을 계산

답변

1

감사한다.

str <- 'day area hour time count 
1 1  0  1  10 
1 1  0  2  12 
1 1  0  3  8 
1 1  0  4  12  
1 1  0  5  15 
1 1  0  6  18 
1 1  1  1  10 
1 1  1  2  12 
1 1  1  3  8 
1 1  1  4  12  
1 1  1  5  15 
1 1  1  6  18 
1 1  1  7  12  
1 1  1  8  15 
1 1  1  9  18 
1 1  2  1  10  
1 1  2  2  18 
1 1  2  3  19' 



file <- textConnection(str) 
df <- read.table(file, header = T) 

df 

library(dplyr) 
df %>% group_by(day, area, hour) %>% 
    mutate(cumcount = cumsum(count), 
     p = cumcount/max(cumcount)) %>% 
    filter(p > 0.8) %>% 
    summarise(time = min(time)) 

결과 :

day area hour time 
    <int> <int> <int> <int> 
1  1  1  0  6 
2  1  1  1  8 
3  1  1  2  3 

또는 시간의 선형 예측으로

80 %에 도달 할 때 :

df %>% group_by(day, area, hour) %>% 
    mutate(cumcount = cumsum(count), 
     p = cumcount/max(cumcount), 
     g = +(p > 0.8), 
     order = (g*2-1)*time) %>% 
    group_by(day, area, hour,g) %>% 
    filter(row_number((g*2-1)*time)==1) %>% 
    group_by(day, area, hour) %>% 
    summarise(time = min(time)+(0.8-min(p))/(max(p)-min(p))) 

결과 그런 비율은 80 % 이상 제 time이다 도착 :

day area hour  time 
    <int> <int> <int> <dbl> 
1  1  1  0 5.166667 
2  1  1  1 7.600000 
3  1  1  2 2.505263 

또는 lag

df %>% group_by(day, area, hour) %>% 
    arrange(hour) %>% 
    mutate(cumcount = cumsum(count), 
     p = cumcount/max(cumcount)) %>% 
    filter((p >= 0.8&lag(p)<0.8)|(p < 0.8&lead(p)>=0.8)) %>% 
    summarise(time = min(time)+(0.8-min(p))/(max(p)-min(p))) 
+0

lead 그래 이것이 내가 5를 얻을 수 있다면 좋을 것 close.But 거의됩니다를 사용하여 동일한 결과를 얻을. ** 대신 6 분 차량이 통과 할 수있는 큰 규모이기 때문이다. 어쨌든 이것은 좋은 것입니다 –

+1

다른 솔루션을 추가했습니다 – Wietze314

+0

@ Wietze314 백분위 수를 사용할 수 있습니까 –