【发布时间】:2019-12-04 18:33:11
【问题描述】:
我有一个想要进行子抽样的大型数据集。我的目标是每天(日期时间)对每个人 (ID) 进行一次测量 (X)。
我原来的df是这样的:
> df
ID X datetime
555 287 450767.0 2018-03-02 15:00:00
556 287 450769.4 2018-03-02 18:00:00
557 287 450672.8 2018-03-03 00:00:00
558 287 450686.0 2018-03-03 03:00:00
559 287 450678.9 2018-03-03 09:00:00
560 287 450678.9 2018-03-03 12:00:00
561 287 450277.6 2018-03-03 21:00:00
562 287 450255.8 2018-03-04 00:00:00
563 287 450916.5 2018-03-04 21:00:00
564 287 450802.1 2018-03-05 21:00:00
565 287 450780.0 2018-03-06 00:00:00
566 287 451074.5 2018-03-06 21:00:00
567 287 450279.3 2018-03-07 00:00:00
568 287 450899.6 2018-03-07 21:00:00
569 287 450685.7 2018-03-03 03:00:00
570 287 450678.6 2018-03-03 09:00:00
571 287 450678.6 2018-03-03 12:00:00
572 287 450277.6 2018-03-03 21:00:00
573 287 450255.8 2018-03-04 00:00:00
574 287 450916.5 2018-03-04 21:00:00
575 287 450802.4 2018-03-05 21:00:00
576 287 450780.0 2018-03-06 00:00:00
577 287 451074.8 2018-03-06 21:00:00
578 287 450279.1 2018-03-07 00:00:00
805 41 450911.1 2018-03-07 12:00:00
806 41 450891.1 2018-03-07 15:00:00
807 41 450883.9 2018-03-07 18:00:00
我尝试了以下方法:
df.thin<-df %>% group_by(ID) %>% group_by(day=floor_date(datetime, "day")) %>% sample_n(size = 1)
但是,这会导致每天测量一次,而不是每个人每天测量一次。
前:
> df.thin
# A tibble: 6 x 4
# Groups: day [6]
ID X datetime day
<fct> <dbl> <dttm> <dttm>
1 287 450767. 2018-03-02 15:00:00 2018-03-02 00:00:00
2 287 450673. 2018-03-03 00:00:00 2018-03-03 00:00:00
3 287 450916. 2018-03-04 21:00:00 2018-03-04 00:00:00
4 287 450802. 2018-03-05 21:00:00 2018-03-05 00:00:00
5 287 451075. 2018-03-06 21:00:00 2018-03-06 00:00:00
6 41 450891. 2018-03-07 15:00:00 2018-03-07 00:00:00
我的目标如下:
> df.thin.goal
# A tibble: 7 x 4
# Groups: day [6]
ID X datetime day
<fct> <dbl> <dttm> <dttm>
1 287 450769. 2018-03-02 18:00:00 2018-03-02 00:00:00
2 287 450686. 2018-03-03 03:00:00 2018-03-03 00:00:00
3 287 450916. 2018-03-04 21:00:00 2018-03-04 00:00:00
4 287 450802. 2018-03-05 21:00:00 2018-03-05 00:00:00
5 287 451075. 2018-03-06 21:00:00 2018-03-06 00:00:00
6 287 450279. 2018-03-07 00:00:00 2018-03-07 00:00:00
7 41 450884. 2018-03-07 18:00:00 2018-03-07 00:00:00
【问题讨论】:
-
我想你的意思是
group_by(ID, day=floor_date(datetime, "day"))。新的group_by会覆盖之前的任何分组。 -
如果您的 df 中的第一列是行号,则您有重复项。分组变量的顺序也可能对您的结果产生影响。例如,如果你想计算时间差,这将给出不同的结果。