Bor*_*rax 3 r dataframe data.table
我可以通过以下方式轻松地将空行添加到数据框:
if(nrow(df)==0){ df[nrow(df)+1,] <- NA }
Run Code Online (Sandbox Code Playgroud)
我怎样才能对 data.table 做同样的事情?
这似乎有效
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)