如何删除不满足条件的值?

How to remove values that do not satisfy the condition?

提问人:Vergriffene 提问时间:11/15/2023 最后编辑:GuedesBFVergriffene 更新时间:11/15/2023 访问量:44

问:

我有一个包含多个日期时间变量的数据集。我想删除变量中不满足条件的值。例如,我有 date_time、date_time1、date_time2(POSIXct 格式)。如果date_time1 < date_time < date_time2,则删除此行。 这是模拟数据帧:

    final <- data.frame (id = c(1,2,3,4,5,6,7,8),
                    date_time = c('2022-07-01 12:01:00', '2022-07-01 12:02:00', '2022-07-01 12:03:00', '2022-07-01 12:04:00', '2022-07-01 12:05:00', '2022-07-01 12:06:00', '2022-07-01 12:07:00', '2022-07-01 12:08:00'),
                    date_time1 = c('2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00', '2022-07-01 12:04:00'),
                    date_time2 = c('2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00', '2022-07-01 12:07:00'))

数据框应如下所示

id  date_time             date_time1            date_time2

1  2022-07-01 12:01:00   2022-07-01 12:04:00   2022-07-01 12:07:00
2  2022-07-01 12:02:00   2022-07-01 12:04:00   2022-07-01 12:07:00
3  2022-07-01 12:03:00   2022-07-01 12:04:00   2022-07-01 12:07:00
4  2022-07-01 12:04:00   2022-07-01 12:04:00   2022-07-01 12:07:00
5  2022-07-01 12:05:00   2022-07-01 12:04:00   2022-07-01 12:07:00
6  2022-07-01 12:06:00   2022-07-01 12:04:00   2022-07-01 12:07:00
7  2022-07-01 12:07:00   2022-07-01 12:04:00   2022-07-01 12:07:00
8  2022-07-01 12:08:00   2022-07-01 12:04:00   2022-07-01 12:07:00

我的代码是:

final$delete <- ifelse((final$date_time > final$date_time1 
                              & final$date_time < final$date_time2), 'delete', 'keep')
final[with(final, !(delete=='delete')),]

所以在条件
之后我想要什么date_time1 < date_time < date_time2

id date_time             date_time1            date_time2
1  2022-07-01 12:01:00   2022-07-01 12:04:00   2022-07-01 12:07:00
2  2022-07-01 12:02:00   2022-07-01 12:04:00   2022-07-01 12:07:00
3  2022-07-01 12:03:00   2022-07-01 12:04:00   2022-07-01 12:07:00
4  2022-07-01 12:04:00   2022-07-01 12:04:00   2022-07-01 12:07:00
7  2022-07-01 12:07:00   2022-07-01 12:04:00   2022-07-01 12:07:00
8  2022-07-01 12:08:00   2022-07-01 12:04:00   2022-07-01 12:07:00

应删除 ID 5 和 ID 6。

但是,在我使用代码后,数据集保持不变。我不知道为什么。如果你能帮忙,谢谢你。

r 日期时间 比较

评论

0赞 GuedesBF 11/15/2023
请不要发布数据截图,而应按照编辑中的建议使用代码块

答:

1赞 Erin Asks 11/15/2023 #1

只需确保在最后一步进行覆盖:final

final <- final[with(final, !(delete=='delete')),]

评论

0赞 Vergriffene 11/15/2023
问题出在上一步。
0赞 user2554330 11/15/2023
这个答案是最好的答案。另一个答案可能也有效,但它不必要地复杂。
0赞 GuedesBF 11/15/2023 #2

在将日期转换为正确的日期时间对象后,我们可以使用单行代码。dplyr

library(dplyr)
library(lubridate)

final |> 
    mutate(across(matches('date_time'), as_datetime)) |> 
    filter(!(date_time > date_time1 & date_time < date_time2)) 

  id           date_time          date_time1          date_time2
1  1 2022-07-01 12:01:00 2022-07-01 12:04:00 2022-07-01 12:07:00
2  2 2022-07-01 12:02:00 2022-07-01 12:04:00 2022-07-01 12:07:00
3  3 2022-07-01 12:03:00 2022-07-01 12:04:00 2022-07-01 12:07:00
4  4 2022-07-01 12:04:00 2022-07-01 12:04:00 2022-07-01 12:07:00
5  7 2022-07-01 12:07:00 2022-07-01 12:04:00 2022-07-01 12:07:00
6  8 2022-07-01 12:08:00 2022-07-01 12:04:00 2022-07-01 12:07:00

评论

0赞 Vergriffene 11/15/2023
它仍然在真实数据集中不起作用。未筛选任何行。我认为问题出在日期时间格式上。
0赞 GuedesBF 11/15/2023
我们可能必须在操作之前转换为正确的日期时间列,se 更新的答案
0赞 Vergriffene 11/15/2023
投票,谢谢!
0赞 Vergriffene 11/15/2023
系统说我需要有 15 个声望才能投票......