2016-08-03 50 views
1

我有一個數據框,其中每一行都是對事件的觀察。有兩列,分別是iddate。我想製作第三欄,標識那些在任何6個月期間有3次或更多事件(基於date)的個人(根據id)。但是,如果事件距前一個事件超過7天,則該事件只能算作唯一。如果用戶可以考慮採用其他方式來完成此任務,則不需要第三列。找到超過6個月的觀察次數超過3的個人子集

id <- c(1,1,1,2,2,2,3,3,3,4,4) 
date <- as.Date(c("2015-01-01", "2015-03-02", "2015-03-05", "2015-01-13", "2015-01-29", "2015-12-15", "2015-01-03", "2015-03-03", "2015-04-03", "2015-01-29", "2015-03-04"),format = "%Y-%m-%d") 
df <- data.frame(id, date) 

在上述方法的僞代碼應該識別單個id == 3爲具有隨着時間的正確的時間間隔所需要的數目OG觀測,同時排除id == 1因爲在日期"2015-03-02""2015-03-05"觀察是於7天內彼此和id == 2的和id == 4,因爲他們有6個月的3個觀測值。

+0

@akrun在我data.frame還有誰遵循了好幾年,可能有高達15條不同的意見的人。我試圖找出所有在任何可能的6個月期間內有3次獨特觀測的那些,但不包括在先前觀測7天內的觀測。 – user6571411

回答

1

可能這有助於

library(data.table) 
setDT(df)[, ind := if(all(diff(date) > 7) & all(diff(date) < 60) & .N >2) TRUE 
         else FALSE , id][] 
# id  date ind 
# 1: 1 2015-01-01 FALSE 
# 2: 1 2015-03-02 FALSE 
# 3: 1 2015-03-05 FALSE 
# 4: 2 2015-01-13 FALSE 
# 5: 2 2015-01-29 FALSE 
# 6: 2 2015-12-15 FALSE 
# 7: 3 2015-01-03 TRUE 
# 8: 3 2015-03-03 TRUE 
# 9: 3 2015-04-03 TRUE 
#10: 4 2015-01-29 FALSE 
#11: 4 2015-03-04 FALSE 
+0

看起來像這樣。你能告訴我爲什麼你選擇所有(差異(日期)<60)嗎?爲了確保我明白,這個論點是爲了找到那些在6個月之內的觀察結果,所以正確的數字不會是<( 365/2)? – user6571411

+0

似乎工作我已經注意到在我的日誌中總是檢查data.table包功能之前,我問一個問題,似乎data.table始終提供了答案 – user6571411

+0

@ user6571411它是檢查是否相鄰日期之間的差距都小於60(因爲我理解這個問題) – akrun