rbindlist: NA в столбец даты и времени - PullRequest
3 голосов
/ 04 апреля 2019

Я пытаюсь создать функцию для вставки строки 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, который я поставил с 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>

Ответы [ 2 ]

5 голосов
/ 04 апреля 2019

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

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 отвлекается на это вероятное намерение автоматически, для удобства.

0 голосов
/ 04 апреля 2019

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

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>
...