我有多个数据框看起来像下面的第一个(部分来自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")
答案 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
它就会更容易。