2013-05-31 35 views
1

我已經在數據表中缺失的行描述從timesids.ccount功能:如何檢測並重新插入缺失的數據?

> dates.dt[1001:1011] 
     sid s.c count    time 
1: missing CLICK 104192 2013-05-25 10:00:00 
2: missing SHARE 7694 2013-05-25 10:00:00 
3: present CLICK 99573 2013-05-25 10:00:00 
4: present SHARE 89302 2013-05-25 10:00:00 
5: missing CLICK  28 2013-05-25 11:00:00 
6: present CLICK  25 2013-05-25 11:00:00 
7: present SHARE  15 2013-05-25 11:00:00 
8: missing CLICK 104544 2013-05-25 12:00:00 
9: missing SHARE 7253 2013-05-25 12:00:00 
10: present CLICK 105891 2013-05-25 12:00:00 
11: present SHARE 88709 2013-05-25 12:00:00 

缺少行是(我期待有一個排的每個第一次的兩個值和第二列和每個時間片):

missing SHARE  0 2013-05-25 11:00:00 

如何檢測和恢復這種缺失行?

我發現這個問題的方法是

library(data.table) 
total <- dates.dt[, list(sum(count)) , keyby="time"] 
setnames(total,"V1","total") 
ts <- dates.dt[s.c=="SHARE" & sid=="missing", list(sum(count)) , keyby="time"] 
cat("SHARE/missing:",nrow(ts),"rows\n") 
stopifnot(identical(total$time,ts$time)) # --> ERROR! 
total$shares.missing <- ts$V1 

現在,我想我可以找到在哪裏ts$timetotal$time 不同,並插入一個0行有首位,但是這似乎是一個相當繁瑣 過程。

謝謝!

+0

* 「失蹤行,顯然是」 * - 哈哈,笏?我認爲你需要詳細闡述一下你期望得到的不同類型的遺漏 – eddi

+1

類似於''rbind'在cbind(expand.grid(unique(dt $ sid),unique(dt $ sc),unique(dt $ time)),0)'然後'setkey(dt,...)'把插入放在正確的位置。 – Frank

+0

@Frank:感謝'expand.grid'!我如何才能找到哪些行存在於其返回值中,但在我的原始數據表中不存在? – sds

回答

2

繼@弗蘭克的建議,你可以這樣做:

setkey(dt, time, sid, s.c) 
dt[J(expand.grid(unique(time),unique(sid),unique(s.c)))][order(time, sid, s.c)] 
#     time  sid s.c count 
# 1: 2013-05-25 10:00:00 missing CLICK 104192 
# 2: 2013-05-25 10:00:00 missing SHARE 7694 
# 3: 2013-05-25 10:00:00 present CLICK 99573 
# 4: 2013-05-25 10:00:00 present SHARE 89302 
# 5: 2013-05-25 11:00:00 missing CLICK  28 
# 6: 2013-05-25 11:00:00 missing SHARE  NA 
# 7: 2013-05-25 11:00:00 present CLICK  25 
# 8: 2013-05-25 11:00:00 present SHARE  15 
# 9: 2013-05-25 12:00:00 missing CLICK 104544 
#10: 2013-05-25 12:00:00 missing SHARE 7253 
#11: 2013-05-25 12:00:00 present CLICK 105891 
#12: 2013-05-25 12:00:00 present SHARE 88709 
+0

是的,這是一個很好的做法。將參數寫入'J()'必須有一些簡短的方法,儘管...?另外,爲什麼'訂單'的結果;聯合還不是排序? – Frank

+1

不確定一個較短的方式,是的,它加入後,通過'sc'(第一,然後'sid',然後'時間')排序,不知道爲什麼 – eddi

+1

啊,呃,它按照相同的順序排序作爲'expand.grid',就像一個連接一樣 – eddi