无论数字相等,都可以获得前n个记录

时间:2017-11-30 22:06:03

标签: r dplyr aggregate

在我的数据集中,我计算了大约200个站点每小时(0-23)自行车站开始的行程次数。

> head(test)
  Start.station.number hour number
1                31000    0     16
2                31000    1      1
3                31000    2      7
4                31000    3      1
5                31000    4      2
6                31000    5     12

我的目标是每小时获得十大站点,但是,很多一些高人气站点可能会有相同的每小时行程数。例如,如果站B,站A和站C都具有相同的行程次数并且在上午7点并列第10位,那么其中一个应该随机选择,选择哪一个并不重要。在R中,无论一些站点具有相同的计数(这与每小时head(n=10)类似的功能),如何按小时计算前十个站点?

以下是数据样本

> dput(test)
structure(list(Start.station.number = c(31000L, 31000L, 31000L, 
31000L, 31000L, 31000L, 31000L, 31000L, 31000L, 31000L, 31000L, 
31000L, 31000L, 31000L, 31000L, 31000L, 31000L, 31000L, 31000L, 
31000L, 31000L, 31000L, 31000L, 31000L, 31001L, 31001L, 31001L, 
31001L, 31001L, 31001L, 31001L, 31001L, 31001L, 31001L, 31001L, 
31001L, 31001L, 31001L, 31001L, 31001L, 31001L, 31001L, 31001L, 
31001L, 31001L, 31001L, 31001L, 31002L, 31002L, 31002L), hour = c(0L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 0L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 
19L, 20L, 21L, 22L, 23L, 0L, 1L, 2L), number = c(16L, 1L, 7L, 
1L, 2L, 12L, 27L, 33L, 36L, 41L, 50L, 36L, 39L, 34L, 22L, 38L, 
40L, 27L, 37L, 31L, 16L, 15L, 16L, 8L, 3L, 3L, 1L, 1L, 2L, 15L, 
30L, 74L, 47L, 49L, 40L, 43L, 54L, 51L, 56L, 48L, 99L, 75L, 48L, 
28L, 24L, 14L, 3L, 16L, 18L, 3L)), .Names = c("Start.station.number", 
"hour", "number"), row.names = c(NA, 50L), class = "data.frame")

2 个答案:

答案 0 :(得分:2)

另一个使用dplyr的示例,这次使用slice。我还添加了一个随机变量来确保关系是随机排序的

library(dplyr)
set.seed(1)
df <- tibble(Start.station.number = sample(1:20, 1000, TRUE), 
             hour = sample(0:23, 1000, TRUE), 
             number = sample(1:20, 1000, TRUE),
             random = runif(1000))

df %>% 
  group_by(hour) %>% 
  arrange(-number, random, .by_group = TRUE) %>% 
  slice(1:10)
#> # A tibble: 240 x 4
#> # Groups:   hour [24]
#>    Start.station.number  hour number     random
#>                   <int> <int>  <int>      <dbl>
#>  1                    9     0     20 0.22558247
#>  2                    1     0     19 0.19954013
#>  3                    3     0     19 0.71950937
#>  4                   19     0     19 0.81171457
#>  5                   15     0     19 0.91195428
#>  6                   17     0     18 0.01283631
#>  7                    8     0     18 0.95778679
#>  8                   14     0     17 0.06196987
#>  9                   10     0     17 0.18180938
#> 10                   19     0     17 0.23981459
#> # ... with 230 more rows

答案 1 :(得分:0)

以下是使用margin-radius:20px; background-color:green; 完全返回10的示例:

dplyr

如果您想要关系,您可以使用便利包装library(dplyr) set.seed(1) df <- tibble(Start.station.number = sample(1:20, 1000, T), hour = sample(1:24, 1000, T), number = sample(1:20, 1000, T)) df %>% group_by(hour) %>% arrange(hour, -number) %>% mutate(rank = row_number()) %>% filter(rank < 11) %>% select(-rank)

top_n