【问题标题】:How to find percentile and then group in R如何找到百分位数然后在R中分组
【发布时间】:2017-07-03 16:52:15
【问题描述】:

我有一个如下所示的数据框 (df)。

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

这里我有 30 天的 87 个区域(1 到 82,然后我有 90、93、95、97、99)和 24 小时(0 到 23)每天的数据。所以数据是关于时间的采取过该地区以及有多少人越过了。

例如:

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 天第 0 小时穿过区域 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 天 0 小时内通过区域 1 所需的时间。所以总车辆数=(10+12+8+12+15+18)=75。所以 75 的 80% 是 60。所以 80% 的车辆(75 的 80%,即 60)在第 1 天第 0 小时通过区域 1 所需的时间将在 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))

但它不起作用。任何帮助表示赞赏

【问题讨论】:

    标签: r dataframe dplyr percentile


    【解决方案1】:

    我的解决方案针对每个time 计算穿过该区域的车辆的百分比。然后得到第一个time的百分比在80%以上:

    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)))
    

    结果:

        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
    

    或使用laglead 获得相同的结果

    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)))
    

    【讨论】:

    • 是的,这几乎接近了。但如果我能得到 5.** 而不是 6 会更好,因为一分钟对于车辆通过来说是一个很大的比例。无论如何这很好
    • 添加了不同的解决方案
    • @Wietze314 有没有机会使用百分位数
    • 您有时间序列中的计数数据。我不明白在那种情况下如何使用百分位数。处理连续数据时可以使用百分位数。
    猜你喜欢
    • 2021-08-16
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2021-01-06
    相关资源
    最近更新 更多