【问题标题】:Reduce data to boolean values while maintaining unique weeks in dplyr将数据减少为布尔值,同时在 dplyr 中保持独特的周数
【发布时间】:2017-10-27 21:11:38
【问题描述】:

给定以下数据

year    date        wk  name       type    holiday closed_day
2017    2017-11-27  48  NA          NA      0         0
2017    2017-12-04  49  NA          NA      0         0
2017    2017-12-11  50  NA          NA      0         0
2017    2017-12-18  51  NA          NA      0         0
2017    2017-12-25  52  Christmas   closed  0         1
2017    2017-12-26  52  NA          NA      0         0
2017    2017-12-31  52  NewYearsEve holiday 1         0

如何使用dplyr获取

year    date        wk  holiday closed_day
2017    2017-11-27  48    0       0
2017    2017-12-04  49    0       0
2017    2017-12-11  50    0       0
2017    2017-12-18  51    0       0
2017    2017-12-25  52    1       1

请注意,我不需要名称或每周输入,如果一周中发生了假期或 closed_day(不是总和,只是布尔值)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果您对获得的yeardate 值的哪一个比较灵活,那么您可以使用:

    library(dplyr)
    df %>%
      group_by(wk) %>%
      summarize_at(vars(year, date, holiday, closed_day), funs(max(.)))
    # # A tibble: 5 × 5
    #      wk  year       date holiday closed_day
    #   <int> <int>     <date>   <int>      <int>
    # 1    48  2017 2017-11-27       0          0
    # 2    49  2017 2017-12-04       0          0
    # 3    50  2017 2017-12-11       0          0
    # 4    51  2017 2017-12-18       0          0
    # 5    52  2017 2017-12-31       1          1
    

    否则

    df %>%
      group_by(wk) %>%
      summarize(year = year[1], date = date[1],
                holiday = 1*any(holiday > 0),
                closed_day = 1*any(closed_day > 0))
    # # A tibble: 5 × 5
    #      wk  year       date holiday closed_day
    #   <int> <int>     <date>   <dbl>      <dbl>
    # 1    48  2017 2017-11-27       0          0
    # 2    49  2017 2017-12-04       0          0
    # 3    50  2017 2017-12-11       0          0
    # 4    51  2017 2017-12-18       0          0
    # 5    52  2017 2017-12-25       1          1
    

    (我第二次对holidayclosed_day 使用了稍微不同的方法,以防你有几周的时间使用“两者”并且只需要&gt; 0 逻辑......在这种情况下,代码会更清晰 -明智/数据明智地保留它logical 而不是数字。)

    【讨论】:

    • df%&gt;%group_by(year,wk)%&gt;%summarise_all(max)%&gt;%select(-name,-type):-)
    • OP 专门说“每周一次”,所以我将其解释为 跨年,所以group_by(year,wk) 也在分组很多。我建议你在 before summarize_all 之前执行select,虽然......它不会改变返回值,但是对于更大的数据集它可能会产生影响。
    • 这很棒。它解决了我的问题。 date = date[1] 在做什么。
    • summarize 要求每个分配的长度为 1。如果我什么都不做,该字段将被删除。我不能做date(如transmute)或date=date,因为它们返回的长度可能大于1。将其视为一种汇总函数;你可以做maxmean等,你也可以有效地做“第一”和“最后”。
    【解决方案2】:

    如果您也对 data.table 方法感兴趣,我们可以这样做:

    library(data.table)
    setDT(df)[, .(date = date[1], holiday = any(holiday), closed = any(closed_day)), 
              by = .(year, wk)]
    
    #    year wk       date holiday closed
    # 1: 2017 48 2017-11-27   FALSE  FALSE
    # 2: 2017 49 2017-12-04   FALSE  FALSE
    # 3: 2017 50 2017-12-11   FALSE  FALSE
    # 4: 2017 51 2017-12-18   FALSE  FALSE
    # 5: 2017 52 2017-12-25    TRUE   TRUE
    

    请注意,我按年和周汇总数据,假设您希望每年的每周都有单独的汇总。

    【讨论】:

      【解决方案3】:

      试试这个:

      library(dplyr)
      
      df %>% 
        group_by(wk) %>% 
        mutate(holiday = max(holiday) > 0,
               closed_day = max(closed_day) > 0) %>% 
        distinct(wk, .keep_all = TRUE) %>% 
        select(year, date, wk, holiday, closed_day)
      

      这给出了:

      # A tibble: 5 x 5
      # Groups:   wk [5]
         year       date    wk holiday closed_day
        <int>     <date> <int>   <lgl>      <lgl>
      1  2017 2017-11-27    48   FALSE      FALSE
      2  2017 2017-12-04    49   FALSE      FALSE
      3  2017 2017-12-11    50   FALSE      FALSE
      4  2017 2017-12-18    51   FALSE      FALSE
      5  2017 2017-12-25    52    TRUE       TRUE
      
      1. wk分组
      2. 通过询问每个 holidayclosed_day 的最大值是否大于 0,将其变为逻辑。
      3. 返回不同的wk
      4. 选择所需的变量

      【讨论】:

      • 不,它会丢弃holiday
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多