2013-05-16 57 views
2

我被困在一個非常簡單的問題上。我有一個數據集,數據間隔是半小時。我想將數據更改爲每小時。這可以通過刪除時間在00:30結束的其他行或行來輕鬆完成。任何幫助,高度讚賞。將每小時半小時的數據轉換爲R,每隔一行除去

樣本數據集如下:

structure(list(date = structure(list(sec = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0), min = c(0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 
30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 
30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 
30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L, 0L, 30L), hour = c(0L, 
0L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 
8L, 9L, 9L, 10L, 10L, 11L, 11L, 12L, 12L, 13L, 13L, 14L, 14L, 
15L, 15L, 16L, 16L, 17L, 17L, 18L, 18L, 19L, 19L, 20L, 20L, 21L, 
21L, 22L, 22L, 23L, 23L, 0L, 0L), mday = c(1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L), mon = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L), year = c(109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 
109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 
109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 
109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 
109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L, 109L), wday = c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L), yday = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 1L), isdst = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst" 
), class = c("POSIXlt", "POSIXt")), year = c(2009, 2009, 2009, 
2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 
2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 
2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 
2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 
2009, 2009, 2009), Discharge = c(36900, 37100, 37100, 37700, 
37800, 37100, 36800, 36100, 36800, 36000, 36600, 36000, 36300, 
36100, 35800, 34500, 34800, 34400, 34200, 34100, 33800, 34800, 
35100, 34900, 34800, 35000, 34600, 34500, 34200, 34300, 34100, 
33700, 33400, 33100, 32400, 32900, 31600, 32200, 32200, 32700, 
32000, 32700,0, 32000, 32000, 31900, 32600, 32600, 31800, 
31900)), .Names = c("date", "year", "Discharge"), row.names = 2:51, class = "data.frame") 
+0

可能重複[RI有一個大表R,現在我要選擇奇數行和該行的第一個元素之前貼上標籤] (http://stackoverflow.com/questions/6183394/ri-have-a-big-table-in-r-now-i-want-to-select-the-odd-rows-and-paste-a-label -b) –

+1

這三個答案都使用布爾子集。這是更有效率還是什麼?我會做'x [seq(1,nrow(x),2),]'。 – Frank

+3

我有時會給「選擇矢量的奇怪元素」作爲家庭作業,所以我有(某處)大量可能的答案。我剛剛給了我想到的第一個答案。 (@GSee的答案更好,因爲它對這個問題更爲具體,對其他類似任務更具概括性。) –

回答

9

由於您的「日期」列爲POSIXlt,因此您可以像這樣設置子集以僅包含分鐘數爲0的行:

x[x$date$min == 0,] 
+0

非常感謝。完美的作品。這將是非常有用的。 –

1

嘗試

dataf <- dataf[seq(nrow(dataf)) %% 2 == 1,] 

(或==0 - 我沒有檢查,看看是否需要奇數或偶數行)

5

R當它們不夠長時,會「回收」載體的元素。因此,要獲得每隔一行,你只需要這樣:

yourdata[c(TRUE,FALSE),] 
+0

我也喜歡使用這種方法,但我只是意識到@ GSee的方法即使在數據很髒並且缺少一行的情況下也可以工作 –

+0

非常真實。除了我確定每一行都正是我所需要的,我還是更喜歡@ GSee的方法。 – Aaron