我正在尝试构建一个函数,以将NA
的行插入到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>
答案 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>