如果nrow=0,如何将空行添加到data.table?

Bor*_*rax 3 r dataframe data.table

我可以通过以下方式轻松地将空行添加到数据框:

if(nrow(df)==0){ df[nrow(df)+1,] <- NA }
Run Code Online (Sandbox Code Playgroud)

我怎样才能对 data.table 做同样的事情?

lmo*_*lmo 5

这似乎有效

library(data.table)
# construct an example
dt <- data.table("a", "b")
dt
   V1 V2
1:  a  b
dt <- dt[0L] # could also use dt[-1L] in this case
Run Code Online (Sandbox Code Playgroud)

请注意,dt[0L]将始终返回一个包含 0 行但与 dt 相同的列的 data.table(刚刚通过 Henrik 的链接了解到这一点)。data.frame 等效项是dat[0L,].

检查它是否有 0 行。以编程方式,您可以nrow按照OP中给出的方式进行检查。

dt
Empty data.table (0 rows) of 2 cols: V1,V2
Run Code Online (Sandbox Code Playgroud)

现在,填充它

dt[NA]
   V1 V2
1: NA NA
Run Code Online (Sandbox Code Playgroud)

正如 Henrik 在下面的评论中指出的那样,idata.table[方法中的参数通常解释NA为 FALSE,这将导致删除与该值关联的行。我们可以看到这一点

data.table("a", "b")[as.logical(NA)]
Empty data.table (0 rows) of 2 cols: V1,V2
Run Code Online (Sandbox Code Playgroud)

或者

data.table("a", "b")[(NA)]
Empty data.table (0 rows) of 2 cols: V1,V2
Run Code Online (Sandbox Code Playgroud)

然而,由于 Henrik 对 data.table 代码的深入挖掘,data.table 的作者在一个特殊情况下构建了dt[NA]返回单行 data.table 的精确语法,该语法在每列中都填充了 NA。在这种情况下,它们将逻辑 NA 替换为 NA 的整数版本,即 NA_integer_。

因此,为了与正确的数据类型保持一致,

dt[NA_integer_]
Run Code Online (Sandbox Code Playgroud)

是首选语法。Frank 在评论中提到,通过将 NA_integer_ 替换为任何正整数值,可以返回相同的结果,例如

dt[1L]
Run Code Online (Sandbox Code Playgroud)

将工作。将这种见解推广到任何 data.table,您可以返回具有 NA 值的单行 data.table

dt[nrow(dt) + 1L]
Run Code Online (Sandbox Code Playgroud)