Как сделать сопоставление значений для объекта даты? - PullRequest
0 голосов
/ 14 мая 2018

Должен ли я всегда выполнять сопоставление значений для объекта даты косвенно, через as.character() или as.numeric(), или есть надежный способ проверить сами объекты даты?

У меня есть несколько наборов данных, где, к сожалению, некоторые переменные даты были заполнены значениями заполнителя - и это не везде одно и то же значение заполнителя. Мне нужно превратить их в настоящие АН. Вот мои значения наполнителя:

# Filler dates: the kind that should be missing
datefiller <- as.POSIXct(c('1899-12-30', 
                           '1900-01-01'), 
                         tz = 'MST')

Итак, проверка ниже должна вернуть ИСТИНА, не так ли?

> as.Date('1899-12-30') %in% datefiller
[1] FALSE

Я имею в виду, если бы я проверил с == вместо этого, я получил бы ожидаемый результат:

> as.Date('1899-12-30') == datefiller
[1]  TRUE FALSE

Другими словами, в таблице ниже должны быть два ИСТИНА и два значения ЛОЖЬ во втором столбце, но все они ЛОЖЬ, и я понятия не имею, почему:

tibble(badandgooddates = c(as.Date('1899-12-30'), 
                           as.Date('1900-01-01'), 
                           Sys.Date(), 
                           as.Date('1776-07-04'))) %>% 
mutate(isbad = badandgooddates %in% datefiller)

Вот что я получаю:

# A tibble: 4 x 2
  badandgooddates isbad
  <date>          <lgl>
1 1899-12-30      FALSE
2 1900-01-01      FALSE
3 2018-05-14      FALSE
4 1776-07-04      FALSE

Когда я принудительно сравниваю строки символов вместо дат, я получаю то, что ожидаю:

> tibble(badandgooddates = c(as.Date('1899-12-30'), 
                             as.Date('1900-01-01'), 
                             Sys.Date(), 
                             as.Date('1776-07-04'))) %>% 
    mutate(isbad = badandgooddates %in% datefiller) %>% 
    mutate(isbadcharacter = as.character(badandgooddates) %in% 
             as.character(datefiller))
# A tibble: 4 x 3
  badandgooddates isbad isbadcharacter
  <date>          <lgl> <lgl>         
1 1899-12-30      FALSE TRUE          
2 1900-01-01      FALSE TRUE          
3 2018-05-14      FALSE FALSE         
4 1776-07-04      FALSE FALSE 
...