Как наиболее эффективно отфильтровать условную строку значений в другом кадре в рамках Tidyverse? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть фрейм данных df1 со столбцом идентификатора и столбцом временного интервала смазки, и я хочу отфильтровать (отобрать) фрейм данных df2, в котором есть столбцы ID и DateTime, чтобы только строки df2 с DateTime соответствовали соответствующему интервалу IDв дф1 сохранены.Я хочу сделать это в рамках Tidyverse.
Это легко сделать с помощью объединения (см. Пример ниже), но я хотел бы знать, будет ли более прямое решение (возможно, основанное на purrr), которое позволит избежатьприсоединение и затем удаление данных временного интервала из второго кадра данных.Спасибо.

Вопрос, размещенный здесь Объединить два кадра данных, если временная метка x находится в пределах временного интервала y , близка к заданной здесь, но предлагаемое решение было похоже на тот, который я разработал, и нев Tidyverse Framework.

Минимальный код, чтобы показать проблему и мое текущее решение:

library(tibble)  
library(lubridate)

df1 <- tribble(
  ~ID, ~Date1, ~Date2,
  "ID1", "2018-04-16", "2018-06-14",
  "ID2", "2018-04-20", "2018-06-25") 
df1 <- mutate(df1,Interval = interval(ymd(Date1),ymd(Date2)))

df2 <- tribble(
  ~ID, ~DateTime,
  "ID1", "2018-04-12",
  "ID1", "2018-05-05",
  "ID2", "2018-04-23",
  "ID2", "2018-07-12")
df2 <- mutate(df2,DateTime=ymd(DateTime)) 

df1 выглядит так

> df1
# A tibble: 2 x 4
  ID    Date1      Date2      Interval                      
  <chr> <chr>      <chr>      <S4: Interval>                
1 ID1   2018-04-16 2018-06-14 2018-04-16 UTC--2018-06-14 UTC
2 ID2   2018-04-20 2018-06-25 2018-04-20 UTC--2018-06-25 UTC

и df2 так:

> df2
# A tibble: 4 x 2
  ID    DateTime  
  <chr> <date>    
1 ID1   2018-04-12
2 ID1   2018-05-05
3 ID2   2018-04-23
4 ID2   2018-07-12

В df2 вторая запись для ID1 находится вне интервала ID1 в df1.Вторая запись для ID2 также не входит в интервал ID2 в df1.

Мое текущее решение, основанное на объединении и удалении объединенного столбца, выглядит следующим образом:

df_out <- df2 %>%
  left_join(.,df1,by="ID") %>%
  filter(.,DateTime %within% Interval) %>%
  select(.,-Interval)

> df_out
# A tibble: 2 x 4
  ID    DateTime   Date1      Date2     
  <chr> <date>     <chr>      <chr>     
1 ID1   2018-05-05 2018-04-16 2018-06-14
2 ID2   2018-04-23 2018-04-20 2018-06-25

У меня такое чувство, что я наблюдаю ситуациюдолжна существовать альтернатива, позволяющая избежать объединения и последующего удаления столбца Interval.

1 Ответ

0 голосов
/ 16 апреля 2019

Существует пакет с именем fuzzyjoin, который может делать semi_join на основе интервала.Полу соединение означает, что он фильтрует «левый» фрейм данных в зависимости от соответствия с «правым» фреймом.Попробуйте:

library(fuzzyjoin)
df2 %>% 
  fuzzy_semi_join(df1, 
                  by=c("DateTime"="Date1", "DateTime"="Date2"),
                  match_fun=list(`>=`, `<=`))

Что дает результат:

# A tibble: 2 x 2
  ID    DateTime  
  <chr> <date>    
1 ID1   2018-05-05
2 ID2   2018-04-23
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...