2014-04-23 20 views
1

這組日期是數據的樣本,我目前的工作:通過bimester

x <- structure(list(sec = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
        min = c(59L, 32L, 23L, 26L, 20L, 14L, 1L, 5L, 32L, 2L), 
        hour = c(10L, 15L, 12L, 12L, 16L, 18L, 18L, 9L, 14L, 12L), 
        mday = c(9L, 15L, 2L, 15L, 20L, 26L, 11L, 22L, 9L, 16L), 
        mon = c(4L, 11L, 10L, 7L, 9L, 8L, 10L, 8L, 8L, 4L), 
        year = c(111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L), 
        wday = c(1L, 4L, 3L, 1L, 4L, 1L, 5L, 4L, 5L, 1L), 
        yday = c(128L, 348L, 305L, 226L, 292L, 268L, 314L, 264L, 251L, 135L), 
        isdst = c(0L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L)), 
       .Names = c("sec", "min", "hour", "mday", "mon", "year", 
          "wday", "yday", "isdst"), 
       class = c("POSIXlt", "POSIXt")) 

這樣

> x 
[1] "2011-05-09 10:59:00" "2011-12-15 15:32:00" "2011-11-02 12:23:00" 
[4] "2011-08-15 12:26:00" "2011-10-20 16:20:00" "2011-09-26 18:14:00" 
[7] "2011-11-11 18:01:00" "2011-09-22 09:05:00" "2011-09-09 14:32:00" 
[10] "2011-05-16 12:02:00" 

說我要按月製表的x分佈。這是我如何完成它:

> table(strftime(x, '%m')) 

05 08 09 10 11 12 
2 1 3 1 2 1 

現在我想做一個類似的列表,但這次我想組由bimester的數據(也可能是三個月或學期以後)。我看了一下help page for strptime,但找不到合適的分隔符。

這是我想出了迄今爲止最好的:

> table(cut(x  = as.numeric(strftime(x, '%m')), 
      breaks = c(1, 3, 5, 7, 9, 11, 13), 
      labels = c('1-2', '3-4', '5-6', '7-8', '9-10', '11-12'), 
      right = FALSE)) 

    1-2 3-4 5-6 7-8 9-10 11-12 
    0  0  2  1  4  3 

正是達到這一的一個令人費解的方式,但它是一個簡單的例子,一個單一的情況下確定。但是,這種方法會讓我頭痛,因爲我希望這些數據保持POSIX(更不用說它使我的代碼比應該更加可怕)。有沒有一個優雅的解決方案呢?

+0

您的意思是從'11-12'類別中排除'12'嗎? – thelatemail

+0

@thelatemail,我沒有。感謝您指出,我會解決它。 –

回答

4

如果您與table和載體,堅持(相對於具有矩形數據/輸出,在這種情況下,我會使用data.table),你可以這樣做:

table(2*(x$mon %/% 2) + 1) 
# 
# 5 7 9 11 
# 2 1 4 3 
+0

謝謝,我實際上已經在原始數據框中嘗試了這種轉換(儘管是'%%')。它有幫助,但我仍在尋找更好的解決方案。 –

+0

@WaldirLeoncio如果您定義了「更好」的概念,那麼它可能會有所幫助 – eddi

+0

夠公平:理想情況下,我正在'strftime'內尋找解決方案。希望這不是要求太多。 : -/ –

1

你可以廢除使用任何類型的日期值自己的format,併爲您的分組創建一個查找向量。這也可以在指定幾個月適合什麼類別的情況下提供全面的靈活性。例如:

src <- factor(rep(c('01-02','03-04','05-06','07-08','09-10','11-12'),each=2)) 

src[x$mon+1] 
#[1] 05-06 11-12 11-12 07-08 09-10 09-10 11-12 09-10 09-10 05-06 
#Levels: 01-02 03-04 05-06 07-08 09-10 11-12 

table(src[x$mon+1]) 

#01-02 03-04 05-06 07-08 09-10 11-12 
# 0  0  2  1  4  3 
+0

乾淨&聰明(+1)。 –