Estoy tratando de inicializar un data.frame sin filas. 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 que 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 debe eliminarse.
¿Hay una mejor manera de hacer esto?
data.frame
ha escrito columnas, así que sí, si desea inicializardata.frame
debe decidir el tipo de columnas ...data.frame
no es realmente restrictivo en la "primitividad" de los tipos de columnas (por ejemplo, puede agregar una columna de fechas o incluso una columna que contenga una lista de elementos). Además, esta pregunta no es una referencia absoluta, ya que, por ejemplo, si no especifica el tipo correcto de la columna, no bloqueará la adición de filas adicionales que tengan columnas de diferentes tipos ... por lo tanto, agregaré una nota, pero no un ejemplo con todos los tipos primitivos, ya que no cubre todas las posibilidades ...data.frame(Doubles=rep(as.double(NA),numberOfRow), Ints=rep(as.integer(NA),numberOfRow))
Si ya tiene un marco de datos existente , digamos
df
que tiene las columnas que desea, puede crear un marco de datos vacío eliminando todas las filas:Tenga en cuenta que
df
todavía contiene los datos, peroempty_df
no los contiene .Encontré esta pregunta buscando cómo crear una nueva instancia con filas vacías, por lo que creo que podría ser útil para algunas personas.
fuente
df[NA,]
esto también afectará el índice (que es poco probable que sea lo que quieres), en su lugar usaríadf[TRUE,] = NA
; sin embargo, tenga en cuenta que esto sobrescribirá el original. Necesitará copiar el marco de datos primerocopy_df = data.frame(df)
y luegocopy_df[TRUE,] = NA
empty_df
conempty_df[0:nrow(df),] <- NA
.Puede hacerlo sin especificar tipos de columna.
fuente
Puede usar
read.table
una cadena vacía para la entrada de latext
siguiente manera:Alternativamente, especificando
col.names
como una cadena:Gracias a Richard Scriven por la mejora.
fuente
read.table(text = "", ...)
así, no necesita abrir explícitamente una conexión.read.csv
enfoque también funciona conreadr::read_csv
, como enread_csv("Date,File,User\n", col_types = "Dcc")
. De esta manera, puede crear directamente un tibble vacío de la estructura requerida.La forma más eficiente de hacer esto es usar
structure
para crear una lista que tenga la clase"data.frame"
:Para poner esto en perspectiva en comparación con la respuesta actualmente aceptada, aquí hay un punto de referencia simple:
fuente
data.table
usualmente contiene un.internal.selfref
atributo, que no se puede falsificar sin llamar a lasdata.table
funciones. ¿Estás seguro de que no estás confiando en un comportamiento indocumentado aquí?data.table
y asumí que Google encontró lo que quería y que todo aquí estádata.table
relacionado.data.frame()
proporciona comprobaciones de nombres, filas, etc.Solo declara
cuando intentes con
rbind
la primera línea creará las columnasfuente
rbind
esto funcionaría bien, si no ...rbind()
.Si buscas escasez:
por lo que no necesita especificar los nombres de columna por separado. Obtiene el tipo de columna predeterminado lógico hasta que complete el marco de datos.
fuente
Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 2
Creé un marco de datos vacío usando el siguiente código
e intenté vincular algunas filas para llenar el mismo de la siguiente manera.
pero comenzó a dar nombres de columna incorrectos de la siguiente manera
La solución a esto es convertir newrow para escribir df de la siguiente manera
ahora proporciona el marco de datos correcto cuando se muestra con los nombres de columna de la siguiente manera
fuente
Para crear un marco de datos vacío , pase el número de filas y columnas necesarias en la siguiente función:
Para crear un marco vacío mientras especifica la clase de cada columna , simplemente pase un vector de los tipos de datos deseados a la siguiente función:
Use de la siguiente manera:
Lo que da:
Para confirmar sus elecciones, ejecute lo siguiente:
fuente
Si desea crear un data.frame vacío con nombres dinámicos (colnames en una variable), esto puede ayudar:
También puede cambiar los tipos si lo necesita. me gusta:
fuente
Si no le importa no especificar los tipos de datos explícitamente, puede hacerlo de esta manera:
fuente
Al usar
data.table
podemos especificar los tipos de datos para cada columna.fuente
Si desea declarar tal
data.frame
con muchas columnas, probablemente será difícil escribir a mano todas las clases de columnas. Especialmente si puede utilizarlorep
, este enfoque es fácil y rápido (aproximadamente un 15% más rápido que la otra solución que se puede generalizar así):Si sus clases de columna deseadas están en un vector
colClasses
, puede hacer lo siguiente:lapply
dará como resultado una lista de la longitud deseada, cada elemento del cual es simplemente un vector tipeado vacío comonumeric()
ointeger()
.setDF
convierte estolist
por referencia a adata.frame
.setnames
agrega los nombres deseados por referencia.Comparación de velocidad:
También es más rápido que usarlo
structure
de manera similar:fuente
Digamos que los nombres de sus columnas son dinámicos, puede crear una matriz vacía con nombre de fila y transformarla en un marco de datos.
fuente
Esta pregunta no abordó específicamente mis inquietudes (descritas aquí ), pero en caso de que alguien quiera hacer esto con un número parametrizado de columnas y sin coerción:
Como dice divibisan sobre la pregunta vinculada,
fuente
Si ya tiene un marco de datos, puede extraer los metadatos (nombres y tipos de columna) de un marco de datos (por ejemplo, si está controlando un ERROR que solo se activa con ciertas entradas y necesita un marco de datos ficticio vacío):
Y luego use el
read.table
para crear el marco de datos vacíofuente