我有一个包含旅程信息的数据集,例如出发时间,出发站等。我正在尝试按出发时间和车站分组。
我创建了一个数据子集,只有一小时的出发和出发站如下:
> 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来说相对较新,我猜这个问题可能有一个快速解决方法,但我还没有找到它。如果您需要更多细节,请与我们联系。
非常感谢任何帮助。
答案 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))
我希望这有帮助!