我有一个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执行此操作答案 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')