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

时间:2018-02-11 14:10:40

标签: r dataframe data.table

我可以通过;

轻松地将空行添加到数据框中
if(nrow(df)==0){ df[nrow(df)+1,] <- NA }

我如何对data.table做同样的事情?

2 个答案:

答案 0 :(得分:3)

这似乎有效

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

请注意,dt[0L]将始终返回一个data.table,其中包含0行但与dt具有相同的列(由于Henrik的链接,我们才知道这一点)。 data.frame等效项为dat[0L,]

检查它是否有0行。以编程方式,您使用nrow进行检查,如OP中所示。

dt
Empty data.table (0 rows) of 2 cols: V1,V2

现在,填写

dt[NA]
   V1 V2
1: NA NA

正如Henrik在下面的评论中指出的那样,data.table的i方法中的[参数通常会将NA解释为FALSE,这会导致丢弃行与此值相关联。我们可以用

看到这一点
data.table("a", "b")[as.logical(NA)]
Empty data.table (0 rows) of 2 cols: V1,V2

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

然而,由于Henrik正在挖掘data.table代码,data.table的作者在一个特殊情况下构建了dt[NA]的确切语法,以返回单行data.table在每列中填充了NA。在这种情况下,它们用NA的整数版本NA_integer _。

替换逻辑NA

因此,为了与适当的数据类型保持一致,

dt[NA_integer_]

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

dt[1L]

会奏效。将此洞察力概括为任何data.table,您可以返回单行data.table,其NA值为

dt[nrow(dt) + 1L]

答案 1 :(得分:0)

另一种选择可能是使用rbind,但是应该知道列数:

library(data.table)

DT <- data.table(id=c(1), Name = c("wow"))

DT2 <- DT[id!=1]

if(nrow(DT2)==0){ 
  DT2 <- rbind(DT2, list(NA, NA))
  }

DT2
#   id Name
#1: NA   NA