请考虑以下空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 :(得分: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)
首先:我建议您从同义包开始使用tibble
。
Here you can see a few good reasons why.
也就是说,下面的答案适用于as.tibble
和as.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
软件包中同时提供purrr
和tidyverse
软件包。
答案 3 :(得分:1)
与Andre Elrico的答案相同,但带有v3t2
:
rep
评论:我同意其他评论者的观点,这可能是XY problem,也就是说,有一种更好的方法可以执行OP的工作。无论如何,我只使用空的data.tables与vetr包进行格式测试。