2015-11-30 22 views
0

計算日期之間的平均差異我有數據集像下面,我想計算每個唯一ID如何通過ID中的R

data: 
    membership_id created_date 
1  12000000 2015-01-20 
2  12000001 2012-11-19 
3  12000001 2013-10-07 
4  12000001 2014-03-06 
5  12000001 2015-01-14 
6  12000003 2013-02-08 
7  12000003 2014-03-06 
8  12000000 2014-02-05 
9  12000000 2012-01-06 

的平均時間差從上面的數據集我想計算日期之間的平均時間差爲每一個獨特的ID

嘗試:

library(plyr) 
data =data[order(data$membership_id,data$created_date),] 
result = ddply(data,.(membership_id),summarize, avg = as.numeric(mean(diff(created_date)))) 

上面的代碼工作正常,當我在小數據應用,但我的數據集是5萬獅子行,它正在採取大量的時間和它仍然是從最後6小時

預期輸出運行:

membership_id avg_time_diff 
1 12000000  76 days 
2 12000001  56 days 
3 12000003  54 days 
+1

請使用'dput'把你的數據的可重複子集在您的文章。 –

+0

您可能會考慮切換到data.table,在這些情況下速度要快很多。 – Heroka

+0

您的期望輸出似乎不符合您的示例輸入。例如,ID「12000000」有3次觀察,大約2年和1年,所以它的平均差異達到了555天。 – Gregor

回答

3

plyr來了,你或許可以轉換很容易dplyr。它不會像數據表一樣快,但它會比ddply

dat %>% group_by(membership_id) %>% 
    arrange(created_date) %>% 
    summarize(avg = as.numeric(mean(diff(created_date)))) 
# Source: local data frame [3 x 2] 
# 
# membership_id avg 
#   (int) (dbl) 
# 1  12000000 555 
# 2  12000001 262 
# 3  12000003 391 

沒有任何更多的真正的努力,你甚至可以通過更多轉換爲data.table對象加快速度,但仍然使用dplyr命令。純data.table仍然會更快。

(使用此數據)

dat = structure(list(membership_id = c(12000000L, 12000001L, 12000001L, 
12000001L, 12000001L, 12000003L, 12000003L, 12000000L, 12000000L 
), created_date = structure(c(16455, 15663, 15985, 16135, 16449, 
15744, 16135, 16106, 15345), class = "Date")), .Names = c("membership_id", 
"created_date"), row.names = c("1", "2", "3", "4", "5", "6", 
"7", "8", "9"), class = "data.frame")