Фильтрация столбца «POSIXct» «POSIXt» на основе значения и NA в R

#r #dataframe #dplyr #tidyverse #posixct

#r #фрейм данных #dplyr #аккуратная вселенная #posixct

Вопрос:

У меня есть фрейм данных, который выглядит более или менее так:

     tail(df)
    # A tibble: 6 x 3
      GEOGCD    OPER_DATE           TERM_DATE          
      <chr>     <dttm>              <dttm>             
    1 E05006867 2009-01-01 00:00:00 2019-03-31 00:00:00
    2 E05006868 2009-01-01 00:00:00 2019-03-31 00:00:00
    3 E05000066 2009-01-01 00:00:00 2018-05-02 00:00:00
    4 E05000067 2009-01-01 00:00:00 2018-05-02 00:00:00
    5 E05000068 2009-01-01 00:00:00 2018-05-02 00:00:00
    6 E05000064 2018-05-01 22:00:00 NA          
    
    str(df)
    tibble [52 × 3] (S3: tbl_df/tbl/data.frame)
     $ GEOGCD   : chr [1:52] "E05000064" "E05000065" "E05000066" "E05000067" ...
     $ OPER_DATE: POSIXct[1:52], format: "2009-01-01 00:00:00" "2009-01-01 00:00:00" "2009-01-01 00:00:00" ...
     $ TERM_DATE: POSIXct[1:52], format: "2018-05-02" "2018-05-02" "2018-05-02" ...
 

Что я хочу сделать, так это выбрать только тех, у кого TERM_DATE выше 2018-12-31 ИЛИ являются NA. В основном что-то вроде этого:

 3 E05000066 2009-01-01 00:00:00 2018-05-02 00:00:00
4 E05000067 2009-01-01 00:00:00 2018-05-02 00:00:00
5 E05000068 2009-01-01 00:00:00 2018-05-02 00:00:00
6 E05000064 2018-05-01 22:00:00 NA   
 

Я пробовал разные вещи, например:

 library(lubridate)
library(dplyr)    
df%>%
filter(TERM_DATE> as.Date("2018-12-31"| is.na(TERM_DATE)))
 

Но я продолжаю получать ошибки, подобные следующим:

Ошибка: проблема с filter() вводом ..1 .
операции x возможны только для числовых, логических или сложных типов
ℹ Ввод ..1 TERM_DATE > as.Date("2018-12-31" | is.na(TERM_DATE)) .

Может ли кто-нибудь из вас понять, почему это может быть и что я должен делать вместо этого?

Спасибо!

Комментарии:

1. может быть filter(TERM_DATE> as.Date("2018-12-31") | is.na(TERM_DATE))

2. Я пробовал так много разных вещей, и есть такое простое решение! Это работает, спасибо!

Ответ №1:

Попробуйте этот подход:

 library(dplyr)
#Code
newdf <- df%>%
  filter(TERM_DATE> as.POSIXct("2018-12-31") | is.na(TERM_DATE))
 

Вывод:

      GEOGCD           OPER_DATE  TERM_DATE
1 E05006867 2009-01-01 00:00:00 2019-03-31
2 E05006868 2009-01-01 00:00:00 2019-03-31
3 E05000064 2018-05-01 22:00:00       <NA>
 

Умное решение от @StupidWolf также работает:

 #Code 2
df%>%
  filter(TERM_DATE> as.Date("2018-12-31") | is.na(TERM_DATE))
 

Вывод:

      GEOGCD           OPER_DATE  TERM_DATE
1 E05006867 2009-01-01 00:00:00 2019-03-31
2 E05006868 2009-01-01 00:00:00 2019-03-31
3 E05000064 2018-05-01 22:00:00       <NA>
 

Ожидаемый результат от OP может быть достигнут с помощью:

 #Code 3
newdf <- df%>%
  filter(TERM_DATE< as.POSIXct("2018-12-31") | is.na(TERM_DATE))
 

Вывод:

      GEOGCD           OPER_DATE  TERM_DATE
1 E05000066 2009-01-01 00:00:00 2018-05-02
2 E05000067 2009-01-01 00:00:00 2018-05-02
3 E05000068 2009-01-01 00:00:00 2018-05-02
4 E05000064 2018-05-01 22:00:00       <NA>
 

Или использование as.Date() . Вам нужно изменить сравнение на < .

Комментарии:

1. Отлично, это работает! Большое вам спасибо за подробный ответ.