【问题标题】:Filter dataframe by time period and id in R在 R 中按时间段和 id 过滤数据帧
【发布时间】:2017-10-10 22:54:12
【问题描述】:

问题:

我正在尝试按依赖于 ID 向量的特定日期时间过滤我的数据框。

具体来说,对于df$id == "A" 的观察,我想删除2017-08-05 00:20:002017-08-10 13:55:00 之间的行。但是,对于df$id == "B" 的观察,我想删除不同时间间隔2017-08-05 00:30:002017-08-10 13:55:00 之间的行。

示例数据框:

date <- as.POSIXct(c("2017-08-04 16:40:00","2017-08-05 00:20:00","2017-08-10 13:55:00","2017-08-15 08:35:00", "2017-08-04 17:20:00","2017-08-05 00:30:00","2017-08-10 13:55:00","2017-08-15 09:30:00"), format = "%Y-%m-%d %H:%M:%S")
value <- as.numeric(c(1, 2, 3, 4, 1, 2, 3, 4))
id <- as.factor(c("A","A","A","A","B","B","B","B"))
df <- data.frame(date, value, id)

期望的输出:

               date value id
2017-08-04 16:40:00     1  A
2017-08-15 08:35:00     4  A
2017-08-04 17:20:00     1  B
2017-08-15 09:30:00     4  B

谢谢!

编辑:如果您的数据框有第三个类别 (df$id == "C") 您想完整保留:

df[which(
  (df$id == "A" & (df$date < "2017-08-05 00:20:00" | df$date > "2017-08-10 13:55:00")) |
    (df$id == "B" & (df$date < "2017-08-05 00:30:00" | df$date > "2017-08-10 13:55:00"))
 | df$id == "C"), ]

【问题讨论】:

    标签: r datetime dplyr lubridate posixct


    【解决方案1】:
    df[which(
            (df$id == "A" & (df$date < "2017-08-05 00:20:00" | df$date > "2017-08-10 13:55:00")) |
            (df$id == "B" & (df$date < "2017-08-05 00:30:00" | df$date > "2017-08-10 13:55:00"))
          ), ]
    

    【讨论】:

    • 谢谢!这非常接近,但df$id == "B" 中的第一个日期应该是2017-08-05 00:30:00 而不是2017-08-04 17:20:00
    • 此解决方案适用于我的示例,但并不能完全满足我对实际数据的要求。如果您想为AB 应用相同的日期过滤器,但您想保留不同ID 的所有数据,例如df$id == "C",您会怎么做?
    猜你喜欢
    • 2022-11-30
    • 2011-08-28
    • 2021-06-25
    • 2016-05-05
    • 2017-09-10
    • 1970-01-01
    • 2018-06-23
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多