【问题标题】:Filter data based on subgroups R基于子组 R 过滤数据
【发布时间】:2021-10-16 19:25:27
【问题描述】:

实际上它要复杂得多,但假设我的数据如下所示:

df <- data.frame(
      id = c(1,1,1,2,2,2,2,3,3,3),
      event = c(0,0,0,1,1,1,1,0,0,0),
      day = c(1,3,3,1,6,6,7,1,4,6),
      time = c("2016-10-25 14:00:00", "2016-10-27 12:00:15", "2016-10-27 15:30:00",
                "2016-10-23 11:00:00", "2016-10-28 08:00:15", "2016-10-28 23:00:00", "2016-10-29 12:00:00",
                "2016-10-24 15:00:00", "2016-10-27 15:00:15", "2016-10-29 16:00:00"))
df$time <- as.POSIXct(df$time)

Output:
   id event day                time
1   1     0   1 2016-10-25 14:00:00
2   1     0   3 2016-10-27 12:00:15
3   1     0   3 2016-10-27 15:30:00
4   2     1   1 2016-10-23 11:00:00
5   2     1   6 2016-10-28 08:00:15
6   2     1   6 2016-10-28 23:00:00
7   2     1   7 2016-10-29 12:00:00
8   3     0   1 2016-10-24 15:00:00
9   3     0   4 2016-10-27 15:00:15
10  3     0   6 2016-10-29 16:00:00

我需要做什么

如果事件为 0,我只想保留每个 id 的最后 24 小时。 如果 event 是 1,我想保留第 6 天。

我知道如何保存过去的 24 小时:

library(lubridate)

last_twentyfour_hours <- df %>%                                      
  group_by(id) %>%                                                             
  filter(time > last(time) - hours(24))

但是我如何为每个组进行不同的过滤呢?

非常感谢您!

【问题讨论】:

  • 我对您的情况有疑问 - 24 hours 规则是否适用于两个“事件”,然后您只希望子集用于“事件 1”,或者它是否像两个规则,即事件 0 -过去 24 小时,事件 1,全天 6?
  • 你的预期输出是什么?

标签: r filter split apply


【解决方案1】:

按“id”、“事件”分组,使用if/else 执行filter,即if 0 在“事件”中,然后使用OP 的条件或else 返回“天”所在的行6

library(dplyr)
library(lubridate)
df %>% 
   group_by(id, event) %>% 
   filter(if(0 %in% event) time > last(time) - hours(24) else 
        day == 6) %>% 
   ungroup

-输出

# A tibble: 5 × 4
     id event   day time               
  <dbl> <dbl> <dbl> <dttm>             
1     1     0     3 2016-10-27 12:00:15
2     1     0     3 2016-10-27 15:30:00
3     2     1     6 2016-10-28 08:00:15
4     2     1     6 2016-10-28 23:00:00
5     3     0     6 2016-10-29 16:00:00

【讨论】:

  • ,@akrun:我们需要你的帮助:stackoverflow.com/questions/69596696/…>
【解决方案2】:

我们可以使用&amp;| 运算符:

df %>%                                      
  group_by(id) %>%                                                             
  filter(event == 0 & time > last(time) - hours(24) |
           event == 1 & day==6)
     id event   day time               
  <dbl> <dbl> <dbl> <dttm>             
1     1     0     3 2016-10-27 12:00:15
2     1     0     3 2016-10-27 15:30:00
3     2     1     6 2016-10-28 08:00:15
4     2     1     6 2016-10-28 23:00:00
5     3     0     6 2016-10-29 16:00:00

【讨论】:

  • 谢谢@TarJae!这也是一个完美的答案!就这么简单……
猜你喜欢
  • 2021-05-23
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2018-06-23
  • 2011-08-28
  • 2014-09-01
  • 2020-09-29
相关资源
最近更新 更多