从时间序列数据框中查找/删除特定行,并从同一数据框中的总计中减去它们的值

时间:2016-09-06 03:27:06

标签: r dplyr

我对R还是新手。我有一个缺课的数据框,其中包含日期列,个别学校ID号,星期几以及当天缺席学生人数。现在,我的框架有三类ID:小学(200),初中(300)和高中(500)。每所学校都有自己的日期和每个学校类型的个人缺勤计数,每个学校类型的所有学校将这些日期的总数合并在一起。

数据的负责人,以及所有小学的总数示例:

Count   Date   ID  DOW
500  1/4/2011 200   1
689  1/5/2011 200   2
345  1/6/2011 200   3
100  1/7/2011 200   4
421  1/8/2011 200   5
1211 1/11/2011 200  1

尾部有一个特定小学的数据:

Count  Date   ID   DOW
 3   1/4/2011 225   3
 3   1/5/2011 225   4
 3   1/6/2011 225   5
 2   1/7/2011 225   1
 2   1/8/2011 225   2
 2   1/11/2011 225  3

我的问题是我的数据框中有几所学校要从时间序列分析中删除,但是他们的个人每日计数与他们学校类型当天的总计数相加。我试图找到一种方法来循环框架并删除那些学校的行,并从他们各自的日期总数中减去他们的计数。所以在分析之后,头部数据看起来更像是:

Count   Date   ID  DOW
497  1/4/2011 200   1
686  1/5/2011 200   2
342  1/6/2011 200   3
98   1/7/2011 200   4
419  1/8/2011 200   5
1209 1/11/2011 200  1

我查看过使用apply()sweep()以及dplyr,但没有发现任何结合循环和减去同一帧内部的内容。

编辑: 为了澄清,这个数据框比我的例子大得多。它有几十所学校,每所学校都有自己的学校特定身份证和每日缺勤人数,但会议日期大致相同。我有大约90,000行观察,所以我自己正在寻找一个自动迭代并检查每个日期和学校ID的过程。

因此,如果使用上面的原始数据子集,其中200 ID是当天所有小学缺勤的总数,那么个别学校的观察结果的例子如下:

Count  Date   ID   DOW
 3   1/4/2011 225   3
 8   1/5/2011 225   4
 12  1/6/2011 225   5
 2   1/7/2011 225   1
 6   1/8/2011 225   2
 7   1/11/2011 225  3
 ..... etc for all dates until end of calendar year for that school
 6   1/4/2011 230   3
 3   1/5/2011 230   4
 2   1/6/2011 230   5
 0   1/7/2011 230   1
 11  1/8/2011 230   2
 4   1/11/2011 230  3
 ..... etc for all dates until end of calendar year for that school, and repeat for next school school.

1 个答案:

答案 0 :(得分:1)

我们可以使用data.table

执行此操作
library(data.table)
setDT(df)[, .(Count = abs(diff(Count)), ID = ID[1L], DOW = DOW[1L]),
       by = .(Date, ID1 = 100* as.numeric(ID) %/%100)][, ID1 := NULL][]
#          Date Count  ID DOW
#1:  1/4/2011   497 200   1
#2:  1/5/2011   686 200   2
#3:  1/6/2011   342 200   3
#4:  1/7/2011    98 200   4
#5:  1/8/2011   419 200   5
#6: 1/11/2011  1209 200   1

数据

df <- structure(list(Count = c(500L, 689L, 345L, 100L, 421L, 1211L, 
3L, 3L, 3L, 2L, 2L, 2L), Date = c("1/4/2011", "1/5/2011", "1/6/2011", 
"1/7/2011", "1/8/2011", "1/11/2011", "1/4/2011", "1/5/2011", 
"1/6/2011", "1/7/2011", "1/8/2011", "1/11/2011"), ID = c(200L, 
200L, 200L, 200L, 200L, 200L, 225L, 225L, 225L, 225L, 225L, 225L
), DOW = c(1L, 2L, 3L, 4L, 5L, 1L, 3L, 4L, 5L, 1L, 2L, 3L)),
.Names = c("Count", 
 "Date", "ID", "DOW"), row.names = c(NA, -12L), class = "data.frame")