Estoy tratando de inicializar un data.frame sin ninguna fila. Básicamente, quiero especificar los tipos de datos para cada columna y nombrarlos, pero no tener ninguna fila creada como resultado.
Lo mejor que he podido hacer hasta ahora es algo como
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
Lo cual crea un data.frame con una sola fila que contiene todos los tipos de datos y nombres de columnas que quería, pero también crea una fila inútil que luego hay que eliminar.
¿Hay una forma mejor de hacer esto?
Sólo hay que inicializarlo con vectores vacíos:
df <- data.frame(Date=as.Date(character()),
File=character(),
User=character(),
stringsAsFactors=FALSE)
Aquí'hay otro ejemplo con diferentes tipos de columnas :
df <- data.frame(Doubles=double(),
Ints=integer(),
Factors=factor(),
Logicals=logical(),
Characters=character(),
stringsAsFactors=FALSE)
str(df)
> str(df)
'data.frame': 0 obs. of 5 variables:
$ Doubles : num
$ Ints : int
$ Factors : Factor w/ 0 levels:
$ Logicals : logi
$ Characters: chr
N.B. :
La inicialización de un data.frame
con una columna vacía de tipo incorrecto no impide que se añadan más filas con columnas de tipos diferentes.
Este método es un poco más seguro en el sentido de que tendrás los tipos de columna correctos desde el principio, por lo que si tu código se basa en alguna comprobación de tipo de columna, funcionará incluso con un data.frame
con cero filas.
Puede utilizar read.table
con una cadena vacía para la entrada text
de la siguiente manera:
colClasses = c("Date", "character", "character")
col.names = c("Date", "File", "User")
df <- read.table(text = "",
colClasses = colClasses,
col.names = col.names)
Alternativamente, especificando el col.names
como una cadena:
df <- read.csv(text="Date,File,User", colClasses = colClasses)
Gracias a Richard Scriven por la mejora