यदि आप data.frame
कई स्तंभों के साथ इस तरह की घोषणा करना चाहते हैं, तो संभवतः सभी कॉलम कक्षाओं को हाथ से टाइप करना एक दर्द होगा। खासकर यदि आप इसका उपयोग कर सकते हैं rep
, तो यह दृष्टिकोण आसान और तेज़ है (अन्य समाधान की तुलना में लगभग 15% तेज है जो इस तरह से सामान्यीकृत किया जा सकता है):
यदि आपकी इच्छित कॉलम कक्षाएं वेक्टर में हैं colClasses
, तो आप निम्न कार्य कर सकते हैं:
library(data.table)
setnames(setDF(lapply(colClasses, function(x) eval(call(x)))), col.names)
lapply
वांछित लंबाई की एक सूची में परिणाम होगा, जिनमें से प्रत्येक तत्व बस की तरह एक खाली टाइप वेक्टर है numeric()
या integer()
।
setDF
list
एक के संदर्भ में यह धर्मान्तरित data.frame
।
setnames
संदर्भ द्वारा वांछित नाम जोड़ता है।
गति तुलना:
classes <- c("character", "numeric", "factor",
"integer", "logical","raw", "complex")
NN <- 300
colClasses <- sample(classes, NN, replace = TRUE)
col.names <- paste0("V", 1:NN)
setDF(lapply(colClasses, function(x) eval(call(x))))
library(microbenchmark)
microbenchmark(times = 1000,
read = read.table(text = "", colClasses = colClasses,
col.names = col.names),
DT = setnames(setDF(lapply(colClasses, function(x)
eval(call(x)))), col.names))
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# read 2.598226 2.707445 3.247340 2.747835 2.800134 22.46545 1000 b
# DT 2.257448 2.357754 2.895453 2.401408 2.453778 17.20883 1000 a
यह structure
समान तरीके से उपयोग करने से भी तेज है :
microbenchmark(times = 1000,
DT = setnames(setDF(lapply(colClasses, function(x)
eval(call(x)))), col.names),
struct = eval(parse(text=paste0(
"structure(list(",
paste(paste0(col.names, "=",
colClasses, "()"), collapse = ","),
"), class = \"data.frame\")"))))
#Unit: milliseconds
# expr min lq mean median uq max neval cld
# DT 2.068121 2.167180 2.821868 2.211214 2.268569 143.70901 1000 a
# struct 2.613944 2.723053 3.177748 2.767746 2.831422 21.44862 1000 b