【发布时间】:2020-04-15 05:40:49
【问题描述】:
我正在尝试根据某些条件对 911 呼叫的数据帧中的对象进行计数,但我遇到了逻辑问题。我的实际数据有超过 300 万行,所以我试图通过考虑这个小子集来简化我的问题:
dat <- structure(list(call = c("14-1234", "14-4523", "14-7711", "14-8199", "14-3124"),
badge = c("8456", "1098", "3432", "4750", "5122"),
off.sex = c("Male", "Male", "Female", "Male", "Male"),
shift = c("1", "1", "1", "1", "2"),
assignedmin = c(1902, 1870, 1950, 1899, 1907),
clearedmin = c(1980, 1910, 1990, 1912, 1956)),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L))
变量“call”标识 911 呼叫,“badge”标识官员,“shift”基本上标识特定区域的一段时间。来电的具体分钟由“assignedmin”给出,并且在“clearedmin”给出的时间认为呼叫已清除。
我想计算给定班次中有多少官员能够响应特定呼叫。例如,对于呼叫 14-1234,在时间 1902 分配了 8456 警官。有多少其他警官能够响应该电话?从 1870 分钟到 1910 分钟,警官 1098 忙于处理不同的呼叫,因此无法响应在 1902 分钟发生的呼叫。但是,基于这个简单的数据集,警官 3432 当时不会很忙因此将被视为可用。 5122 警官当时无人值守,但在不同的班次,因此不被视为有空。
期望的输出:
call badge off.sex shift assignedmin clearedmin n_shift n_avail n_unavail n_shift_male n_male_avail
1 14-1234 8456 Male 1 1902 1980 4 2 2 3 1
2 14-4523 1098 Male 1 1870 1910 4 4 0 3 3
3 14-7711 3432 Female 1 1950 1990 4 3 1 3 2
4 14-8199 4750 Male 1 1899 1912 4 3 1 3 2
5 14-3124 5122 Male 2 1907 1956 1 1 1 1 1
我希望这不会太复杂。基本上,在assignmin 给定的时间,如果他或她在同一个班次并且没有忙于另一个电话,则他或她有空。我可以使用 dplyr 和 data.table 轻松计算轮班人员的数量,如下所示:
dat <- dat %>% group_by(shift) %>% mutate(n_shift = uniqueN(badge),
n_shift_male = uniqueN(badge[off.sex == 'Male']) %>% ungroup()
【问题讨论】:
标签: r dplyr data.table