此解决方案假定日期按时间顺序列出(或至少按天排序)并且日期实际格式化为日期时间对象。
temp <- data.frame(dates = c('1990-02-02 01:00:00',
'1990-02-02 02:00:00',
'1990-02-03 01:00:00',
'1990-02-03 02:00:00',
'1990-02-04 01:00:00',
'1990-02-04 02:00:00',
'1990-02-04 03:00:00'))
temp$dates <- as.POSIXct(temp$dates, tz = "GMT")
x <- table(as.Date(temp$dates))
temp$number <- rep(seq_along(x), x)
temp
# dates number
# 1 1990-02-02 01:00:00 1
# 2 1990-02-02 02:00:00 1
# 3 1990-02-03 01:00:00 2
# 4 1990-02-03 02:00:00 2
# 5 1990-02-04 01:00:00 3
# 6 1990-02-04 02:00:00 3
# 7 1990-02-04 03:00:00 3
基本思想是去掉时间(使用as.Date
)并将每天的频率制成表格。然后,您可以rep
在该输出上使用来创建您的“数字”变量。
拍打额头,贴个更简单的解决办法
只需factor
使用as.Date
. 这甚至适用于data.frame
数据未排序的情况:
temp <- data.frame(dates = c('1990-02-02 01:00:00',
'1990-02-02 02:00:00',
'1990-02-03 01:00:00',
'1990-02-03 02:00:00',
'1990-02-04 01:00:00',
'1990-02-04 02:00:00',
'1990-02-04 03:00:00'))
temp$dates <- as.POSIXct(temp$dates, tz = "GMT")
within(temp, {
counts <- as.numeric(factor(as.Date(dates)))
})
# dates counts
# 1 1990-02-02 01:00:00 1
# 2 1990-02-02 02:00:00 1
# 3 1990-02-03 01:00:00 2
# 4 1990-02-03 02:00:00 2
# 5 1990-02-04 01:00:00 3
# 6 1990-02-04 02:00:00 3
# 7 1990-02-04 03:00:00 3