1

拥有这些数据:

dates
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

我可以创建一个列,其中每一行都有这样的天数吗?

number dates
1      1990-02-02 01:00:00
1      1990-02-02 02:00:00
2      1990-02-03 01:00:00
2      1990-02-03 02:00:00
3      1990-02-04 01:00:00
3      1990-02-04 02:00:00
4

3 回答 3

2

rank 函数应该可以满足您的需要,但请查阅它的文档,因为没有一个易于重现的示例供我使用

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$datesonly<-as.Date(temp$dates)
temp2<-data.frame(dates=unique(temp$datesonly),ranks=rank(unique(temp$datesonly),ties.method="first"))
temp<-merge(temp,temp2,by.x="datesonly",by.y="dates")
于 2013-06-11T13:57:56.023 回答
2

此解决方案假定日期按时间顺序列出(或至少按天排序)并且日期实际格式化为日期时间对象。

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
于 2013-06-11T14:24:45.250 回答
0

尝试这个...

- library(lubridate)

date <- 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")

number <- day(date)
cbind.data.frame(number,date)
于 2013-06-11T14:12:07.897 回答