rbindlist: NA в столбец даты и времени

#r #data.table #posixct

#r #данные.таблица #posixct

Вопрос:

Я пытаюсь создать функцию для вставки строки NA s в data.table. Я использую rbindlist таким образом, чтобы выполнить это, где x является data.table :

 rbindlist(
  list(
    x,
    as.list(rep(NA, ncol(x)))
  )
)
  

Я сталкиваюсь с проблемой, из-за которой POSIXct столбцы не могут быть привязаны к NA значениям, как в:

 x <- data.table(
  a=c(1,2),
  t=c(Sys.time(), Sys.time() 100)
)

rbindlist(
  list(
    x,
    as.list(rep(NA, ncol(x)))
  )
)
  

это приводит для меня к следующей ошибке:

     Error in rbindlist(list(x, as.list(rep(NA, ncol(x))))) : 
  Class attributes at column 2 of input list at position 2 does not match with column 2 of input list at position 1. Coercion of objects of class 'factor' alone is handled internally by rbind/rbindlist at the moment.
  

Таким образом, он не может связать NA i, предоставленный с POSIXct столбцом x$t .

Вопрос: как я могу привязать одну строку data.table всех NA значений к столбцу data.table с POSIXct типом?

Я попробовал следующее, что привело к той же ошибке:

 rbindlist(
  list(
    x,
    as.list(c(NA, as.POSIXct(NA)))
  )
)
  

Представляет интерес: вызов следующего в оригинале data.table

 x[2, t:=NA]
x[2, a:=NA]
  

ВОЗВРАТ:

     a                   t
1:  1 2019-04-04 12:38:57
2: NA                <NA>
  

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

1. пожалуйста, добавьте информацию о версии пакета data.table

2. packageVersion("data.table") #[1] ‘1.10.4.3’

Ответ №1:

Вы можете сделать

 library(data.table)
x <- data.table(
  a=c(1,2),
  t=c(Sys.time(), Sys.time() 100)
)

x[c(1:.N, NA)]

#     a                   t
# 1:  1 2019-04-04 13:01:34
# 2:  2 2019-04-04 13:03:14
# 3: NA                <NA>

# or

rbind(x, x[NA])
  

В базе R вы бы использовали NA_integer_ для последнего, но data.table обрабатывает NA таким же образом для удобства. Вы можете увидеть специальное обращение, например, с x[(NA)] . Это задокументировано в vignette("datatable-faq") :

2.17 Каковы меньшие синтаксические различия между data.frame и data.table

[…]

DT[NA] возвращает 1 строку NA , но DF[NA] возвращает всю копию, DF содержащую NA повсюду. Символ NA является типом logical в R и поэтому перерабатывается [.data.frame . Намерение пользователя, вероятно, было DF[NA_integer_] . [.data.table для удобства автоматически перенаправляется на это вероятное намерение.

Ответ №2:

Вы также можете сделать что-то вроде этого-

 library(data.table)
> a <- copy(x)[1]
> a[a] <- NA
> rbind(x,a)
    a                   t
1:  1 2019-04-04 12:54:47
2:  2 2019-04-04 12:56:27
3: NA                <NA>