Как использовать функцию is.na с датами - PullRequest
1 голос
/ 23 октября 2019

Я преобразовал переменные, которые были сохранены как «дд-мммм-гггг» (т.е. 18 апреля 2016 года), в даты в формате «мм-дд-гггг», используя следующее:

data$variable = as.Date(data$variable, "%d-%b-%Y")

Это работало прекрасно. В качестве дополнительного бонуса, пропущенные значения, которые ранее были пробелами, теперь кажутся NA в моем наборе данных после выполнения этой команды. Однако затем я попытался сделать эти значения NA 0 с is.na:

data[is.na(data)] <- 0

Но я получаю следующую ошибку:

Error in as.Date.numeric(value) : 'origin' must be supplied

Я не смог понять, как это исправить. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Вы можете попробовать следующие подходы, чтобы преобразовать NA в 0.

library(tidyr)
library(tidyverse)
library(dplyr)

mutate_all(x, ~replace(., is.na(.), 0)
mutate_all(x, ~replace_na(., 0))
library(dplyr)

# This converts at column level.
df <- df %>%
    mutate(Col1 = if_else(is.na(Col1), 0, Col1))


x <- replace(x,is.na(x),0)

Надеюсь, что один из вышеперечисленных будет работать.

0 голосов
/ 23 октября 2019

Дата «0» может быть неоднозначной:

  • Время POSIX (так называемое время эпохи, время Unix, ref: https://en.wikipedia.org/wiki/Unix_time) определяет время / дату «0» в "00:00:00 UTC 1 января 1970 года" ;
  • Дата Excel 0 определена как 1/0/1900 (что кажется странным); аналогично время 0 равно 1/0/1900 12:00:00 AM
  • другие общественные / религиозные организации могут предпочесть другие ссылки (например, Ислам может быть «началом 7-го века нашей эры» , wiki ref ; христианство может предпочесть год 0 CE;нет предвзятости, не пламенные войны, пожалуйста)

В R, если вы определили что-то класса POSIXt или Date, то преобразование его обратно в число с as.numeric будет следовать за POSIX /соглашение об эпохе, означающее, что

as.numeric(as.Date("1969-01-01"))
# [1] -365

Но оно никогда не предполагает эпоху при неоднозначной записи даты / времени, поэтому вы должны указать ее с помощью origin=. (Обратите внимание, что я не долженукажите источник в предыдущей команде, поскольку "1969-01-01" является не числовым и имеет однозначный формат даты, который as.Date может легко ввестиerpret;as.Date("1969") не работает, возможно, потому что это может быть любая дата в течение 1969 года.)

Поэтому, чтобы быть однозначным, я предлагаю вам использовать

as.Date(0, origin="1970-01-01")

as.POSIXct(0, origin="1970-01-01") # assumes 00:00:00 UTC
as.POSIXct(0, origin="1970-01-01 00:00:00")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...