2016-08-01 23 views
0

我有一個這樣的數據框,其中包含乘客ID,日期和它們的原始位置。如何提取在R中創建每日第一次登機記錄

ID DATE  Origin 
1 01/01/2012 A 
1 01/01/2012 B 
1 01/01/2012 C 
1 01/02/2012 A 
1 01/02/2012 B 
1 01/02/2012 C 
1 01/03/2012 A 
1 01/03/2012 B 
1 01/08/2012 A 
2 01/01/2012 D 
2 01/01/2012 C 
2 01/01/2012 B 
2 01/04/2012 D 
2 01/04/2012 C 
2 01/06/2012 D 
3 01/03/2012 F 
3 01/03/2012 G 
3 01/09/2012 F 
3 01/09/2012 G 

我想通過使用由ID和DATE以上

ID DATE  Origin 
    1 01/01/2012 A 
    1 01/02/2012 A 
    1 01/03/2012 A 
    1 01/08/2012 A 
    2 01/01/2012 D 
    2 01/04/2012 D 
    2 01/06/2012 D 
    3 01/03/2012 F 
    3 01/09/2012 F 

組所示的datafram,取爲原點的第一個值的每個組中,以創造「每日第一登機記錄」。

目前,我現在使用此代碼

Daily_First_record = aggregate(ORIGIN ~ ID + DATE, data=df, FUN='[', i=1) 

然而,這段代碼運行緩慢,因爲我的原始數據集是相當大(約1Gb的CSV)。有沒有簡單的方法來完成同樣的工作?

回答

0

我們可以使用dplyr

library(dplyr) 
df1 %>% 
    group_by(ID, DATE) %>% 
    summarise(Origin = first(Origin)) 
0

data.table應該是相當快:

> dat[, .SD[1], by = c("ID", "DATE")] 
    ID  DATE Origin 
1: 1 01/01/2012  A 
2: 1 01/02/2012  A 
3: 1 01/03/2012  A 
4: 1 01/08/2012  A 
5: 2 01/01/2012  D 
6: 2 01/04/2012  D 
7: 2 01/06/2012  D 
8: 3 01/03/2012  F 
9: 3 01/09/2012  F 

dat <- fread("ID DATE  Origin 
      1 01/01/2012 A 
      1 01/01/2012 B 
      1 01/01/2012 C 
      1 01/02/2012 A 
      1 01/02/2012 B 
      1 01/02/2012 C 
      1 01/03/2012 A 
      1 01/03/2012 B 
      1 01/08/2012 A 
      2 01/01/2012 D 
      2 01/01/2012 C 
      2 01/01/2012 B 
      2 01/04/2012 D 
      2 01/04/2012 C 
      2 01/06/2012 D 
      3 01/03/2012 F 
      3 01/03/2012 G 
      3 01/09/2012 F 
      3 01/09/2012 G")