在R

时间:2017-05-30 05:09:47

标签: r date data.table

我有一个data.table dt,看起来像:

> dt[1:20, c("p_date", "p_time")]
        p_date           p_time
 1:      20170422          0916
 2:      20170421          1011         
 3:      20170112          1528
 4:      20170318          1111
 5:      20170322          0957
 6:      20170321          1115
 7:      20170304          1532
 8:      20170322          1417
 9:      20170401          1242
10:      20170321          1812
11:      20170401          1821
12:      20170401          1509
13:      20170320          1655
14:      20170401          1518
15:      20170320          1444
16:      20170401          1712
17:      20170317          1021
18:      20170322          1816
19:      20170305          1056
20:      20170319          1428

我想知道表dt的列p_date的值缺少哪个日期。

这里的日期格式为yyyymmdd,我想找出列表中最小日期和最大日期值之间的缺失日期。

输出必须是data.table,其中一列为缺失日期值

如何使用r

中的data.table执行此操作

2 个答案:

答案 0 :(得分:2)

您可以定义最小日期和最长日期之间的日期向量,如下所示:

dateRangeVec <- range(as.Date(as.character(dt$p_date), format = "%Y%m%d")) 
allDatesVec <- format(seq(from = dateRangeVec[1], 
        to = dateRangeVec[2], 'days'), "%Y%m%d")

然后,您可以使用setdiff

过滤数据表中没有的所有日期
outDt <- data.table(p_date = setdiff(allDatesVec, dt$p_date)) 

答案 1 :(得分:2)

我们可以使用加入on'p_date'(将列转换为Date类后),创建另一个具有“p_date”全范围的数据集

dt[, p_date := lubridate::ymd(p_date)]
dt1 <- data.table(p_date = seq(min(dt$p_date), max(dt$p_date), by = '1 day'))

dt[dt1, on = 'p_date'][is.na(p_time), p_date]

或另一种选择是使用anti_join

中的dplyr
library(dplyr)
anti_join(dt1, dt, on = 'p_date')