rbindlist:不适用的日期时间列

mom*_*822 3 r posixct data.table

我正在尝试构建一个函数来将NAs 的行插入到data.table中。我使用rbindlist这种方式来完成它,这里x是一个data.table

rbindlist(
  list(
    x,
    as.list(rep(NA, ncol(x)))
  )
)
Run Code Online (Sandbox Code Playgroud)

我遇到一个问题,即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)))
  )
)
Run Code Online (Sandbox Code Playgroud)

这对我来说导致以下错误:

    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.
Run Code Online (Sandbox Code Playgroud)

因此,它不能够结合NA与提供的I POSIXctx$t

问题:如何使用-type列data.table将所有NA值的单行绑定到?data.tablePOSIXct

我尝试了以下操作,导致相同的错误:

rbindlist(
  list(
    x,
    as.list(c(NA, as.POSIXct(NA)))
  )
)
Run Code Online (Sandbox Code Playgroud)

感兴趣:在原始文件上调用以下内容 data.table

x[2, t:=NA]
x[2, a:=NA]
Run Code Online (Sandbox Code Playgroud)

返回值:

    a                   t
1:  1 2019-04-04 12:38:57
2: NA                <NA>
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 5

你可以做

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])
Run Code Online (Sandbox Code Playgroud)

在基础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贯穿。该符号在R中NA键入logical,因此由回收[.data.frame。用户的意图可能是DF[NA_integer_][.data.table为了方便,自动转移到此可能的意图。