由bimester分组日期

时间:2014-04-23 21:29:34

标签: r date strptime strftime

以下是我目前正在处理的数据示例:

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(更不用说它使我的代码比它应该更加可怕)。对此有优雅的解决方案吗?

2 个答案:

答案 0 :(得分:4)

如果您坚持使用table和向量(而不是使用矩形数据/输出,在这种情况下我会使用data.table),您可以这样做:< / p>

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

答案 1 :(得分:1)

您可以取消使用任何类型的format - 日期值本身,并为您的分组创建查找向量。这也可以灵活地指定适合哪些类别的月份。 E.g:

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