Должен ли я всегда выполнять сопоставление значений для объекта даты косвенно, через 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