2017-05-30 52 views
-2

我有一个data.table DT,它看起来像:寻找失踪日期从柱日期data.table R中

> 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中

回答

2

做到这一点与data.table你可以定义最小和日期之间的矢量你的最大日期是这样的:

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)) 
+0

@nicola THX,已编辑答案相应 – ikop

2

我们可以使用一个连接on“p_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] 

或其他选项创建另一个数据集(列转换为Date下课)是使用anti_joindplyr

library(dplyr) 
anti_join(dt1, dt, on = 'p_date') 
+1

你知道什么'分钟(DT $ p_date):最大(DT $ p_date)'实际上产生? “p_date”列不是“日期”。您的最终结果将包含像'20170399'这样的日期。 – nicola

+0

@nicola好吧,我转换为Date类 – akrun

+2

Data.table也有反连接,fyi,像'X [!Y]' – Frank