2016-05-12 15 views
0

在数据帧元素难减法我有以下数据帧:中的R

 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.我需要在列的下方计算这些差异。我一直在努力想办法,但我不知所措。

我需要为每个DATE和SCP执行此操作。

是否有一种方法可以施加TIME以使每个4小时的时间框架成为一列?我想这条路,但有错误(大概是因为我在CA UNIT SCP和DATE

我也一直在试图弄明白使用dplyr GROUP_BY和总结。我坚持重复列。

我一直在想,有解决这个问题的一个简单的方法,但它是逃避我。谁能帮助?

谢谢。

+1

你的时间列已经是4小时差异。如果是这种情况,那么diff命令应该可以工作。一旦计算出来,然后使用cut命令和dplyr中的group_by进行总结。如果通过提供示例输出可以更清楚地说明,则提供最终解决方案会更容易。 – Dave2e

+0

它不是data.frame(也不是data.table),尽管它可能继承自data.frame。无论调用哪个dplyr对象,我都认为是'data_frame'。你应该发布输出:'dput(object)' –

回答

2

如果我正确理解你的问题,我不认为dplyr或data.table是必需的:

df$newEntries <- c(diff(df$ENTRIES),0) 

(据推测,最后一项不能有任何数量的条目,所以为0)

编辑:

啊,我看你想这对每个组而延伸的解决方案:

df %>% group_by(DATE,SCP) %>% mutate(newEntries = c(diff(ENTRIES),0)) 
+0

感谢您的回复。当我运行这个代码时,newEntries会返回所有的0值。思考? – Windstorm1981

+0

嗯,这很奇怪,你应该为akrun的代码得到相同的0 ...他的data.table解决方案与我的dplyr相同。 (他绝对值得在这一个答案,移动比差异更快),是否有可能数据集中的组只包含一个元素? – Shape

+0

啊,我看到了问题,我使用了'Entries'而不是'ENTRIES' – Shape

2

使用data.table,转换“data.frame”到“data.table”(setDT(df)),通过“日期”和“SCP”我们分配(:=)“newEntries”为“条目差异”并连接分组与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的等效代码将组'DATE','SCP',然后使用mutate创建'newEntries'列,方法是将“ENTRIES”的值设为lead(即与目前的“条件”相符)。在这里,我更改了default选项,因为默认情况下lead会将NA作为最后一项。通过改变ENTRIES[n()],我们团体的每一种组合获得“参赛作品”的最后一个值两者的差异将是0

library(dplyr) 
df %>% 
    group_by(DATE, SCP) %>% 
    mutate(newEntries = lead(ENTRIES, default=ENTRIES[n()]) - ENTRIES) 
+0

谢谢。你能解释dplyr下的mutate行吗?我理解这个函数,但什么是“lead(?ENTRIES,default = ENTRIES [n()]) - ENTRIES)”? – Windstorm1981

+0

@ Windstorm1981默认情况下,lead将返回最后一个条目的NA。通过执行'default = ENTRIES [n()]',我们可以得到组的最后一次观察结果,通过做出差异,我们得到0. – akrun

+1

我认为你在第一个解决方案中有一个错字,应该是c (ENTRIES),0),转变很酷,我在将来使用 – Shape