我可以通过;
轻松地将空行添加到数据框中if(nrow(df)==0){ df[nrow(df)+1,] <- NA }
我如何对data.table做同样的事情?
答案 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 _。
因此,为了与适当的数据类型保持一致,
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