为空的data.table

时间:2018-09-27 14:24:55

标签: r data.table

请考虑以下空data.table

library(data.table)
dats = data.table(
    pr.full=numeric(), mse.full=numeric(), rt.full=numeric(),
    pr.aicf=numeric(), mse.aicf=numeric(), rt.aicf=numeric(),
    pr.aicb=numeric(), mse.aicb=numeric(), rt.aicb=numeric(),
    pr.bicf=numeric(), mse.bicf=numeric(), rt.bicf=numeric(),
    pr.bicb=numeric(), mse.bicb=numeric(), rt.bicb=numeric(),
    pr.r_min=numeric(), mse.r_min=numeric(), rt.r_min=numeric(),
    pr.r_1se=numeric(), mse.r_1se=numeric(), rt.r_1se=numeric(),
    pr.l_min=numeric(), mse.l_min=numeric(), rt.l_min=numeric(),
    pr.l_1se=numeric(), mse.l_1se=numeric(), rt.l_1se=numeric(),
    pr.l_refit=numeric(), mse.l_refit=numeric(), rt.l_refit=numeric() 
)

显然,此规范中有很多冗余:是否有更好的方法来实现这一目标-例如

  • 一个data.table,其中一行包含30个0
  • 覆盖列名
  • 删除0的行

那也不是很漂亮..但是比上面更好。其他/更好的解决方案将不胜感激。

4 个答案:

答案 0 :(得分:3)

您可以使用类似(cols是带有列名的向量)

as.data.table(matrix(numeric(0),nrow=0,ncol=length(cols),dimnames=list(NULL,cols)))

应该强调的是,可能没有解决方案会非常优雅和R-ish。通常,您不要让对象在循环内增长,因为它效率很低。相反,您应该预分配对象,然后填充值。

答案 1 :(得分:2)

这是一种实现方式:

vars <- c(paste0("var",1:10))

dats = data.table()
dats = dats[,{ans<-lapply(vars,function(x)numeric());names(ans)<-vars;ans}]

您当然可以用变量名替换vars的伪内容。

答案 2 :(得分:1)

首先:我建议您从同义包开始使用tibbleHere you can see a few good reasons why. 也就是说,下面的答案适用于as.tibbleas.data.frame

library(purrr)
cnames <- c("pr.full", "mse.full", "rt.full", "pr.aicf", "mse.aicf", "rt.aicf", 
            "pr.aicb", "mse.aicb", "rt.aicb", "pr.bicf", "mse.bicf", "rt.bicf", 
            "pr.bicb", "mse.bicb", "rt.bicb", "pr.r_min", "mse.r_min", "rt.r_min", 
            "pr.r_1se", "mse.r_1se", "rt.r_1se", "pr.l_min", "mse.l_min", 
            "rt.l_min", "pr.l_1se", "mse.l_1se", "rt.l_1se", "pr.l_refit", 
            "mse.l_refit", "rt.l_refit")
dats <- as.data.frame(matrix(nrow=0,ncol=length(cnames),))
colnames(dats) <- cnames
dats[, 1:30] <- map(dats[, 1:30], as.numeric)

PS:tibble软件包中同时提供purrrtidyverse软件包。

答案 3 :(得分:1)

与Andre Elrico的答案相同,但带有v3t2

rep

评论:我同意其他评论者的观点,这可能是XY problem,也就是说,有一种更好的方法可以执行OP的工作。无论如何,我只使用空的data.tables与vetr包进行格式测试。