以下是我目前正在处理的数据示例:
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 :(得分: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