提问人:Vergriffene 提问时间:11/15/2023 最后编辑:GuedesBFVergriffene 更新时间:11/15/2023 访问量:44
如何删除不满足条件的值?
How to remove values that do not satisfy the condition?
问:
我有一个包含多个日期时间变量的数据集。我想删除变量中不满足条件的值。例如,我有 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。
但是,在我使用代码后,数据集保持不变。我不知道为什么。如果你能帮忙,谢谢你。
答:
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 个声望才能投票......
评论