I am trying to build a function to insert a row of NAs into a data.table. I am using rbindlist in this way to accomplish it, where x is a data.table:
rbindlist(
  list(
    x,
    as.list(rep(NA, ncol(x)))
  )
)
I am encountering an issue whereby POSIXct columns cannot be bound with NA values, as in:
x <- data.table(
  a=c(1,2),
  t=c(Sys.time(), Sys.time()+100)
)
rbindlist(
  list(
    x,
    as.list(rep(NA, ncol(x)))
  )
)
this results for me in the following error:
    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.
So it not able to bind the NA I supplied with the POSIXct column x$t.
Question: how can I bind a single-row data.table of all NA values to a data.table with a POSIXct-type column?
I have tried the following, which resulted in the same error:
rbindlist(
  list(
    x,
    as.list(c(NA, as.POSIXct(NA)))
  )
)
Of interest: calling the following on the original data.table
x[2, t:=NA]
x[2, a:=NA]
Returns:
    a                   t
1:  1 2019-04-04 12:38:57
2: NA                <NA>
You can do
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])
In base R, you would use NA_integer_ for the latter, but data.table treats NA the same way for convenience. You can see the special treatment, eg, with x[(NA)]. This is documented in vignette("datatable-faq"):
2.17 What are the smaller syntax differences between data.frame and data.table
[...]
DT[NA]returns 1 row ofNA, butDF[NA]returns an entire copy ofDFcontainingNAthroughout. The symbolNAis typelogicalin R and is therefore recycled by[.data.frame. The user's intention was probablyDF[NA_integer_].[.data.tablediverts to this probable intention automatically, for convenience.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With