我有一个这样的数据框,其中包含乘客ID,日期和原始位置。
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
我希望使用上面显示的datafram创建“每日首次登机记录”
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
按ID和DATE分组,取每组中Origin的第一个值。
目前,我现在正在使用此代码
Daily_First_record = aggregate(ORIGIN ~ ID + DATE, data=df, FUN='[', i=1)
但是,此代码运行缓慢,因为我的原始数据集非常大(大约1Gb csv)。有没有简单的方法来做同样的工作?
答案 0 :(得分: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")
答案 1 :(得分:0)
我们可以使用dplyr
library(dplyr)
df1 %>%
group_by(ID, DATE) %>%
summarise(Origin = first(Origin))