我正在尝试id
根据条件过滤对(由 标识)。我有以下数据框,
id <- c(1,1,2,2,1,1,3,3,4,4)
PorF <- c("start","fail","start","pass","start","pass","start","pass","start","fail")
timest <- c(as.POSIXct("2021-05-08 08:15:07"),
as.POSIXct("2021-05-08 08:15:45"),
as.POSIXct("2021-05-28 08:17:09"),
as.POSIXct("2021-05-28 08:17:25"),
as.POSIXct("2021-05-28 08:32:07"),
as.POSIXct("2021-05-28 08:32:12"),
as.POSIXct("2021-05-28 08:33:14"),
as.POSIXct("2021-05-28 08:33:45"),
as.POSIXct("2021-05-28 08:34:12"),
as.POSIXct("2021-05-28 08:34:56"))
testdf <- data.frame(id, PorF, timest)
testdf
> testdf
id PorF timest
1 1 start 2021-05-08 08:15:07
2 1 fail 2021-05-08 08:15:45
3 2 start 2021-05-28 08:17:09
4 2 pass 2021-05-28 08:17:25
5 1 start 2021-05-28 08:32:07
6 1 pass 2021-05-28 08:32:12
7 3 start 2021-05-28 08:33:14
8 3 pass 2021-05-28 08:33:45
9 4 start 2021-05-28 08:34:12
10 4 fail 2021-05-28 08:34:56
我想过滤那些有 start 和 pass 的 ID。所有有 start 和 fail 的配对都应该被过滤掉。
我的预期输出应该是这样的,
> filtered_testdf
id PorF timest
2 start 2021-05-28 08:17:09
2 pass 2021-05-28 08:17:25
1 start 2021-05-28 08:32:07
1 pass 2021-05-28 08:32:12
3 start 2021-05-28 08:33:14
3 pass 2021-05-28 08:33:45
我正在尝试的是这个,但它并没有给我想要的东西,
testdf |>
group_by(id) |>
filter(PorF == "start" & PorF == "pass")
知道如何实现预期结果吗?
您可以执行以下操作:
或者等价地:
请注意,我必须创建一个额外的 id 变量,因为(参见我上面的评论)有几对具有相同 id 的行(即 id 1 有两对)。
您可以编写一个小辅助函数,根据每对的第一行(开始)或第二行(结果)将数据分成两部分(假设您的对是连续的),然后找出第二行中通过(或失败)的行。然后将它们合并起来。
基本 R 选项,但遵循与deschen 解决方案相同的理念