Отфильтровать строки между двумя значениями - PullRequest
0 голосов
/ 03 апреля 2020

У меня проблема с фильтрацией некоторых строк.

Пример набора данных:

df <- data.frame(id = c("1", "1", "1", "2", "2", "2", "3", "3"), description= c("Start", "Something", "Final", "Start", "Some Other Thing", "Final", "Start", "Final"), timestamp = c("2017-07-26 23:41:16", "2017-07-27 20:23:16", "2017-07-29 07:06:53", "2017-07-24 04:53:02", "2017-07-25 10:27:02", "2017-07-26 16:51:43", "2017-07-13 08:33:05")))

Теперь я хочу удалить все группы, в которых нет других значений между description = "Start" и description = "Final". И это должно быть сделано для каждой группы идентификаторов. В этом примере это будет группа с идентификатором 3.

Любая помощь будет оценена. Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 03 апреля 2020

Таким образом, следующее может быть одним из решений вашей проблемы.

Test = df %>% aggregate(description~id, data=., FUN=function(x) c(count=length(x)))
Test$id = as.factor(Test$id)
df = inner_join(df, Test, by = "id")
df = df[df$description.y > 2, ]

Идея состоит в том, чтобы отфильтровать все группы, которые имеют только два описания (Start, Final) через inner_join. Вывод:

> df
  id    description.x           timestamp description.y
1  1            Start 2017-07-26 23:41:16             3
2  1        Something 2017-07-27 20:23:16             3
3  1            Final 2017-07-29 07:06:53             3
4  2            Start 2017-07-24 04:53:02             3
5  2 Some Other Thing 2017-07-25 10:27:02             3
6  2            Final 2017-07-26 16:51:43             3

Это то, что вы имели в виду?

0 голосов
/ 03 апреля 2020

другое решение

library(tidyverse)
df %>% 
  group_by(id) %>% 
  mutate(n = n()) %>% 
  filter(n != 2)
0 голосов
/ 03 апреля 2020

Если мы конвертируем timestamp в datetime, то мы можем просто отсортировать данные и использовать cumsum, чтобы сделать то, что вы хотите (я думаю).

library(dplyr)
library(lubridate)

df %>%
  mutate(timestamp = lubridate::as_datetime(timestamp)) %>%
  group_by(id) %>%
  arrange(id, timestamp) %>%
  mutate(tracker = cumsum(description %in% c("Start", "Final"))) %>%
  filter((tracker %% 2 == 1) & description != "Start")
#> # A tibble: 2 x 4
#> # Groups:   id [2]
#>   id    description      timestamp           tracker
#>   <fct> <fct>            <dttm>                <int>
#> 1 1     Something        2017-07-27 20:23:16       1
#> 2 2     Some Other Thing 2017-07-25 10:27:02       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...