我有以下数据框:
CA UNIT SCP DATE TIME DESC ENTRIES EXITS
(chr) (chr) (chr) (chr) (chr) (chr) (dbl) (dbl)
1 A002 R051 02-00-00 03-10-13 04:00:00 REGULAR 4026243 1386869
2 A002 R051 02-00-00 03-10-13 08:00:00 REGULAR 4026273 1386886
3 A002 R051 02-00-00 03-10-13 12:00:00 REGULAR 4026382 1386951
4 A002 R051 02-00-00 03-10-13 16:00:00 REGULAR 4026612 1387002
5 A002 R051 02-00-00 03-10-13 20:00:00 REGULAR 4026878 1387051
6 A002 R051 02-00-00 03-11-13 00:00:00 REGULAR 4026955 1387080
7 A002 R051 02-00-00 03-11-13 04:00:00 REGULAR 4026972 1387082
8 A002 R051 02-00-00 03-11-13 08:00:00 REGULAR 4027014 1387182
9 A002 R051 02-00-00 03-11-13 12:00:00 REGULAR 4027189 1387473
10 A002 R051 02-00-00 03-11-13 16:00:00 REGULAR 4027413 1387547
我正在尝试计算每4小时时间范围内的条目。因此,04:00:00到08:00:00之间的条目数是4026273 - 4026243.我需要在列中一直计算这些差异。我一直试图想办法,但我不知所措。
我需要为每个日期和SCP做这件事。
有没有办法施放TIME,所以每4小时的时间框架变成一列?我试过那条路线但有错误(大概是因为我在CA UNIT SCP和DATE有重复的列
我也一直试图用dplyr group_by和总结来解决这个问题。我被卡住了。
我一直认为有一种简单的方法可以解决这个问题,但它正在逃避我。有人可以帮忙吗?
谢谢。
答案 0 :(得分:2)
如果我理解你的问题,我不认为需要dplyr或data.table:
df$newEntries <- c(diff(df$ENTRIES),0)
(据推测,最后一个条目不能有任意数量的条目,因此是0)
编辑:
啊,我看到你希望每个小组都这样做,以便扩展解决方案:
df %>% group_by(DATE,SCP) %>% mutate(newEntries = c(diff(ENTRIES),0))
答案 1 :(得分:2)
使用data.table
,转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)
),按日期分组&#39;和&#39; SCP&#39;我们分配了(:=
)&#39; newEntries&#39;作为&#34; ENTRIES&#39;的差异并与0连接(因为diff
输出的长度比每组的行数少一个)
library(data.table)
setDT(df)[, newEntries := c(diff(ENTRIES),0) , .(DATE, SCP)]
diff
可能很慢,因此我们也可以使用shift
setDT(df)[, newEntries :=shift(ENTRIES, type="lead",
fill= ENTRIES[.N])- ENTRIES ,.(DATE, SCP)]
或者dplyr
的等效代码将按“日期”分组,&#39; SCP&#39;然后使用mutate
创建&#39; newEntries&#39;列取了&#34; ENTRIES&#34;的lead
值的差值(即后续值)与当前&#34; ENTRIES&#34;的值相同。在这里,我更改了default
选项,因为默认情况下lead
将NA作为最后一个条目。通过更改为ENTRIES[n()]
,我们可以获得&#39; ENTRIES&#39;的最后一个值。对于每个组的组合,使差异为0。
library(dplyr)
df %>%
group_by(DATE, SCP) %>%
mutate(newEntries = lead(ENTRIES, default=ENTRIES[n()]) - ENTRIES)