按小时分组和R中的因子

时间:2018-03-25 22:58:50

标签: r

我有一个包含旅程信息的数据集,例如出发时间,出发站等。我正在尝试按出发时间和车站分组。

我创建了一个数据子集,只有一小时的出发和出发站如下:

> head(d)
  hour  id
1    8 101
2   18 101
3   17 102
4   18 101
5   13 101
6    9 101

在上面的子集中,只有两个站点(id):101和102。

我正在尝试汇总这些数据,以获得每小时和每个站的离场总数。类似的东西:

  hour  id  count
1    0 101  10
2    1 101   0
3    2 101   3
...
25   0 102   7
26   1 102   9

我可以实现与我正在寻找的接近的东西:

aggregate(d$hour, by = list(d$hour, d$id), FUN = length)

   Group.1 Group.2  x
1        1     101  1
2        2     101  2
3        6     101  7
4        7     101 38

但是,上面的输出不会为没有偏离的小时数提供零值。例如,上面的输出是41行长,但我预计会有48行(每个站有两个站点和24小时观测值)。

我已将hour字段修改为一个因素:

d$hour <- factor(d$hour, 0:23)

以便在调用table时显示正确的计数:

> table(d$hour)

  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23 
  0   3   3   0   0   1  10  49  95  69  14  19  20  25  26  28  42 117  77  45  14   8   7   5 

我对R来说相对较新,我猜这个问题可能有一个快速解决方法,但我还没有找到它。如果您需要更多细节,请与我们联系。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

无法找到重复的内容(但我确定无论如何都存在)。 xtabs函数将计算零条目,as.data.frame函数将宽table - 格式转换为长格式:

as.data.frame(xtabs( ~hour+id, data=d)  )
   hour  id Freq
1    13 101    1
2    17 101    0
3    18 101    2
4     8 101    1
5     9 101    1
6    13 102    0
7    17 102    1
8    18 102    0
9     8 102    0
10    9 102    0

我认为一个小的数据对象可能没有表示所有的小时数,但是如果你想确定的话,你总是可以附加一组假的零小时条目。

答案 1 :(得分:2)

您可以使用

library(dplyr)
library(tidyr)
d <- data.frame("hour" = c('8', '18', '17', '18', '13', '9'),
                "id" = c('101', '101', '102', '101', '101', '101'))
d$hour <- factor(d$hour, 0:23)
d %>% group_by(hour, id) %>% summarise(count = n()) %>% complete(hour, id) %>%
  mutate(count = ifelse(is.na(count), 0, count))

我希望这有帮助!