2014-01-30 56 views
0

我有多個數據框,看起來像下面的第一個(部分來自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

請提供'dput(df)'的輸出。 –

+0

謝謝@Sven,編輯的問題。 – ptenax

回答

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它。

+0

謝謝@BrodieG。它幾乎工作 - 新的矢量「時代」是完美的。但是'合併'過程將''時間'中的每個新的30分鐘類別與'starttime'中的每個條目進行匹配。我需要指定一個「by」論據嗎?我無法修改成功。 'dput'上面。提前致謝! – ptenax

+0

@ptenax,合併列的名稱必須與「合併」相同才能按寫入方式工作。看起來你添加的'dput'數據不具有相同的名稱(我使用原始表中的名稱)。你只需要使用'by.x = nameofyourtimecolumn','by.y = starttime'。 – BrodieG

+0

再次感謝@BrodieG,我的矢量名稱是正確的,但我必須將其中一個時間矢量從因子轉換爲POSIXct,才能按照您的描述工作。幫了我很多。 – ptenax