统计不存在的日期

3

我正在处理一个包含以下两列的数据帧:

    time        frequency
  2014-01-06       13
  2014-01-07       30
  2014-01-09       56

我的问题是,我想计算频率为0的天数。数据使用RPostgreSQL/RSQLite进行提取,因此除非有值(即除非频率至少为1),否则没有日期时间。如果我想要统计实际上不存在于数据表中的这些日期,有没有简单的方法可以做到?例如,如果我们考虑日期范围为2014-01-01到20-14-01-10,我希望它能统计7天。
我的想法是粗暴地创建一个包含每个日期的单独数据表(请注意,这是四年以上的日期,将是一个巨大的工作量),然后合并两个数据表并计算NA值的数量。我相信一定有比我想到的更优雅的解决方案。
谢谢!

有没有办法在不手动创建的情况下创建第二个数据集? - Andrew
2
这是我的版本 df2 <- data.frame(time= seq(as.Date('2014-01-01'), as.Date('2014-01-10'), by='day')); setkey(setDT(df1), time)[df2, sum(is.na(frequency))]#[1] 7 - akrun
1个回答

9
按日期排序,然后查找间隙。
start <- as.Date("2014-01-01")
time <- as.Date(c("2014-01-06", "2014-01-07","2014-01-09"))
end <- as.Date("2014-01-10")

time <- sort(unique(time))

# Include start and end dates, so the missing dates are 1/1-1/5, 1/8, 1/10
d <- c(time[1]- start,
       diff(time) - 1,
       end - time[length(time)] )

d # [1] 5 0 1 1
sum(d) # 7 missing days

现在需要查找缺失的日期...

(gaps <- data.frame(gap_starts = c(start,time+1)[d>0],
                    gap_length = d[d>0]))
#   gap_starts gap_length
# 1 2014-01-01          5
# 2 2014-01-08          1
# 3 2014-01-10          1    

for (g in 1:nrow(gaps)){
  start=gaps$gap_starts[g]
  length=gaps$gap_length[g]
  for(i in start:(start+length-1)){
    print(as.Date(i, origin="1970-01-01"))
  }
}
# [1] "2014-01-01"
# [1] "2014-01-02"
# [1] "2014-01-03"
# [1] "2014-01-04"
# [1] "2014-01-05"
# [1] "2014-01-08"
# [1] "2014-01-10"

2
好主意。可能 OP 正在寻找 sum(diff(x$date)) + 1L - David Arenburg
2
使用OP的数据集,i1 <- diff(as.Date(unique(c('2014-01-01', df1$time, '2014-01-10')))); sum(i1[i1>1]) - akrun
好主意 @akrun。如果您不介意,我会使用它,但我还会加入一个循环来告诉哪些日期缺失。 - C8H10N4O2
当我使用这段代码时,它会返回:"rbind(deparse.level, ...)中的错误:参数的列数不匹配"。 - Andrew
1
@Andrew 我无法重现你的错误,但在生成缺失日期的过程中,我已经重写了它,不再使用 data.frame 语法。 - C8H10N4O2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接