Wenn Sie eine solche Erklärung abgeben wollen data.frame
Bei vielen Spalten wird es wahrscheinlich mühsam sein, alle Spaltenklassen von Hand einzutippen. Vor allem, wenn Sie die folgenden Funktionen nutzen können rep
Dieser Ansatz ist einfach und schnell (etwa 15 % schneller als die andere Lösung, die auf diese Weise verallgemeinert werden kann):
Wenn die gewünschten Spaltenklassen in einem Vektor enthalten sind colClasses
können Sie wie folgt vorgehen:
library(data.table)
setnames(setDF(lapply(colClasses, function(x) eval(call(x)))), col.names)
lapply
ergibt eine Liste der gewünschten Länge, wobei jedes Element einfach ein leerer typisierter Vektor ist wie numeric()
o integer()
.
setDF
wandelt diese list
durch Bezugnahme auf eine data.frame
.
setnames
fügt die gewünschten Namen per Verweis hinzu.
Vergleich der Geschwindigkeit:
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
Es ist auch schneller als die Verwendung von structure
in ähnlicher Weise:
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