R中数据帧中元素的难以减去

时间:2016-05-12 02:30:01

标签: r dplyr reshape2

我有以下数据框:

     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和总结来解决这个问题。我被卡住了。

我一直认为有一种简单的方法可以解决这个问题,但它正在逃避我。有人可以帮忙吗?

谢谢。

2 个答案:

答案 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)