【问题标题】:Sub-sampling by ID and Day按 ID 和日期进行子抽样
【发布时间】: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 中的第一列是行号,则您有重复项。分组变量的顺序也可能对您的结果产生影响。例如,如果你想计算时间差,这将给出不同的结果。

标签: r dplyr lubridate


【解决方案1】:

您可以为 group_by() 提供多个参数,它将按多个分组变量分层分组。那应该可以解决您的问题:

  df.thin<-df %>% 
  group_by(ID, day=floor_date(datetime, "day")) %>% 
  sample_n(size = 1)

结果:

> df.thin
# A tibble: 7 x 4
# Groups:   ID, day [7]
     ID       X datetime            day                
  <dbl>   <dbl> <dttm>              <dttm>             
1    41 450884. 2018-03-07 18:00:00 2018-03-07 00:00:00
2   287 450767  2018-03-02 15:00:00 2018-03-02 00:00:00
3   287 450278. 2018-03-03 21:00:00 2018-03-03 00:00:00
4   287 450256. 2018-03-04 00:00:00 2018-03-04 00:00:00
5   287 450802. 2018-03-05 21:00:00 2018-03-05 00:00:00
6   287 451075. 2018-03-06 21:00:00 2018-03-06 00:00:00
7   287 450900. 2018-03-07 21:00:00 2018-03-07 00:00:00

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多