我对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.
答案 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")