rbindlist:不适用的日期时间列

时间:2019-04-04 16:44:32

标签: r data.table posixct

我正在尝试构建一个函数,以将NA的行插入到data.table中。我以这种方式使用rbindlist来完成它,其中xdata.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.

因此它无法绑定NAPOSIXct附带的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 个答案:

答案 0 :(得分: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])

在基数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转移到此   为方便起见,可能会自动产生可能的意图。

答案 1 :(得分:0)

您还可以执行以下操作-

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>