I'm trying to initialize a data.frame without any rows. Basically, I want to specify the data types for each column and name them, but not have any rows created as a result.
The best I've been able to do so far is something like:
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
Which creates a data.frame with a single row containing all of the data types and column names I wanted, but also creates a useless row which then needs to be removed.
Is there a better way to do this?
Just initialize it with empty vectors:
Here's an other example with different column types :
N.B. :
Initializing a
data.frame
with an empty column of the wrong type does not prevent further additions of rows having columns of different types.This method is just a bit safer in the sense that you'll have the correct column types from the beginning, hence if your code relies on some column type checking, it will work even with a
data.frame
with zero rows.This question didn't specifically address my concerns (outlined here) but in case anyone wants to do this with a parameterized number of columns and no coercion:
As divibisan states on the linked question,
If you want to create an empty data.frame with dynamic names (colnames in a variable), this can help:
You can change the types as well if you need so. like:
Say your column names are dynamic, you can create an empty row-named matrix and transform it to a data frame.
I created empty data frame using following code
and tried to bind some rows to populate the same as follows.
but it started giving incorrect column names as follows
Solution to this is to convert newrow to type df as follows
now gives correct data frame when displayed with column names as follows
If you want to declare such a
data.frame
with many columns, it'll probably be a pain to type all the column classes out by hand. Especially if you can make use ofrep
, this approach is easy and fast (about 15% faster than the other solution that can be generalized like this):If your desired column classes are in a vector
colClasses
, you can do the following:lapply
will result in a list of desired length, each element of which is simply an empty typed vector likenumeric()
orinteger()
.setDF
converts thislist
by reference to adata.frame
.setnames
adds the desired names by reference.Speed comparison:
It's also faster than using
structure
in a similar way: