添加具有零观察值的周期/行

时间:2014-01-30 18:52:02

标签: r

我有多个数据框看起来像下面的第一个(部分来自this post)。我以30分钟的时间间隔总结了观察结果。但我的原始数据集显示没有观察到的时间段的行。因此,如果在30分钟内没有观察到,则没有数据。零有意义,所以我想添加它们,这样我就可以在'观察之夜'上绘制一个完整的模式。该图将采用多个覆盖线的形式,每个代表不同的夜晚,因此每个表(如下所示;从一个晚上)需要相同数量的观察周期,以及相同的起点和终点。

我考虑添加一个新的字符向量period<-c("15:30", "16:00", ..., "07:00"),但其他列需要重新排列才能匹配。同样,如果我分解了向量starttime

我有什么。

        starttime       Freq
1   2013-08-21 18:00:00     27
2   2013-08-21 18:30:00     13
3   2013-08-21 19:00:00     16
4   2013-08-21 19:30:00     5
5   2013-08-21 20:00:00     8
6   2013-08-21 20:30:00     9
7   2013-08-21 21:00:00     26
8   2013-08-21 21:30:00     22
9   2013-08-21 22:00:00     61
10  2013-08-21 22:30:00     93
11  2013-08-21 23:00:00     54
12  2013-08-21 23:30:00     42
13  2013-08-22 00:00:00     11
14  2013-08-22 00:30:00     2
15  2013-08-22 01:00:00     2
16  2013-08-22 01:30:00     3
17  2013-08-22 02:00:00     2
18  2013-08-22 03:00:00     1
19  2013-08-22 04:00:00     11

str(df)
'data.frame':   19 obs. of  2 variables:
$ time2: Factor w/ 19 levels "2013-08-21 18:00:00",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Freq : int  27 13 16 5 8 9 26 22 61 93 ...

我希望如何。

        starttime       Freq
1   2013-08-21 15:30:00     0
2   2013-08-21 18:00:00     27
3   2013-08-21 18:30:00     13
4   2013-08-21 19:00:00     16
5   2013-08-21 19:30:00     5
6   2013-08-21 20:00:00     8
7   2013-08-21 20:30:00     9
8   2013-08-21 21:00:00     26
9   2013-08-21 21:30:00     22
10  2013-08-21 22:00:00     61
11  2013-08-21 22:30:00     93
12  2013-08-21 23:00:00     54
13  2013-08-21 23:30:00     42
14  2013-08-22 00:00:00     11
15  2013-08-22 00:30:00     2
16  2013-08-22 01:00:00     2
17  2013-08-22 01:30:00     3
18  2013-08-22 02:00:00     2
19  2013-08-22 02:30:00     0
20  2013-08-22 03:00:00     1
21  2013-08-22 03:30:00     0
22  2013-08-22 04:00:00     11
23  2013-08-22 04:30:00     0
24  2013-08-22 05:00:00     0
25  2013-08-22 05:30:00     0
26  2013-08-22 06:00:00     0
27  2013-08-22 06:30:00     0

总是非常感谢你的建议。

编辑。以下是dput

structure(list(time2 = structure(1:19, .Label = c("2013-08-21 18:00:00", 
"2013-08-21 18:30:00", "2013-08-21 19:00:00", "2013-08-21 19:30:00", 
"2013-08-21 20:00:00", "2013-08-21 20:30:00", "2013-08-21 21:00:00", 
"2013-08-21 21:30:00", "2013-08-21 22:00:00", "2013-08-21 22:30:00", 
"2013-08-21 23:00:00", "2013-08-21 23:30:00", "2013-08-22 00:00:00", 
"2013-08-22 00:30:00", "2013-08-22 01:00:00", "2013-08-22 01:30:00", 
"2013-08-22 02:00:00", "2013-08-22 03:00:00", "2013-08-22 04:00:00"
), class = "factor"), Freq = c(27L, 13L, 16L, 5L, 8L, 9L, 26L, 
22L, 61L, 93L, 54L, 42L, 11L, 2L, 2L, 3L, 2L, 1L, 11L)), .Names = c("time2", 
"Freq"), row.names = c(NA, -19L), class = "data.frame")

1 个答案:

答案 0 :(得分:2)

您可以使用merge

times <- data.frame(starttime=seq(
  as.POSIXct("2013-08-21 18:00:00"), 
  as.POSIXct("2013-08-22 06:30:00"),
  by="30 min"
) )
df.fin <- merge(df, times, all.y=T)
df.fin$Freq[is.na(df.fin$Freq)] <- 0
df.fin
#              starttime Freq
# 1  2013-08-21 18:00:00   27
# 2  2013-08-21 18:30:00   13
# 3  2013-08-21 19:00:00   16
# 4  2013-08-21 19:30:00    5
# 5  2013-08-21 20:00:00    8
# ... ommitted values ...
# 20 2013-08-22 03:30:00    0
# 21 2013-08-22 04:00:00   11
# 22 2013-08-22 04:30:00    0
# 23 2013-08-22 05:00:00    0
# 24 2013-08-22 05:30:00    0
# 25 2013-08-22 06:00:00    0
# 26 2013-08-22 06:30:00    0

此外,正如sven建议的那样,如果您的输入数据在列中有空格,那么dput它就会更容易。