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