添加新的一天列

时间:2013-06-11 13:52:43

标签: r

拥有这些数据:

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

3 个答案:

答案 0 :(得分: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$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")

答案 1 :(得分: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

答案 2 :(得分: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)