আপনি যদি 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