2012-03-29 12 views
34

Estoy tratando de recopilar algunos datos de múltiples subconjuntos de un conjunto de datos y necesito crear un marco de datos para recopilar los resultados. Mi problema es que no sé cómo crear un marco de datos vacío con un número definido de columnas sin tener realmente datos para poner en él.R definir las dimensiones del marco de datos vacío

collect1 <- c() ## i'd like to create empty df w/ 3 columns: `id`, `max1` and `min1` 

for(i in 1:10){ 
collect1$id <- i 
ss1 <- subset(df1, df1$id == i) 
collect1$max1 <- max(ss1$value) 
collect1$min1 <- min(ss1$value) 
} 

me siento muy tonta esta pregunta (casi me siento como que he pedido en SO antes, pero no lo encuentro), pero agradecería mucho cualquier ayuda.

+0

no probado, pero este fue el primer éxito de Google, parece que la respuesta de @Gabor debería funcionar: http: //r.789695.n4 .nabble.com /Empty-data-frame-td846772.html – Chase

Respuesta

21

Basta con crear una trama de datos de vectores vacíos:

collect1 <- data.frame(id = character(0), max1 = numeric(0), max2 = numeric(0)) 

Pero si sabe cuántas filas que va a tener de antemano, simplemente deberá crear la trama de datos con que muchas filas a Empezar con.

+3

En general, usaría NA: 'data.frame (a = NA, b = NA, C = NA)'. –

+4

Pero eso no crea un marco de datos vacío: es un marco de datos de una fila que resulta ser todos los valores faltantes. –

+0

Cierto, pero en mi defensa, uno puede omitir la primera fila post festum. :) Sería interesante ver cuál es el propósito detrás del problema de OP. Estoy pensando que las cosas se podrían resolver usando apply y do.call. –

11

Usted puede hacer algo como:

N <- 10 
collect1 <- data.frame(id = integer(N), 
         max1 = numeric(N), 
         min1 = numeric(N)) 

Ahora tener cuidado de que en el resto de su código, que se olvidó de utilizar el índice de la fila para llenar la fila hoja.de.datos por fila. Debe ser:

for(i in seq_len(N)){ 
    collect1$id[i] <- i 
    ss1 <- subset(df1, df1$id == i) 
    collect1$max1[i] <- max(ss1$value) 
    collect1$min1[i] <- min(ss1$value) 
} 

Por último, diría que hay muchas alternativas para hacer lo que usted está tratando de lograr, algunos podrían ser mucho más eficiente y uso mucho menos escribir. Por ejemplo, podría mirar la función aggregate o ddply del paquete plyr.

85

¿Funcionaría un marco de datos de NA s? algo como:

data.frame(matrix(NA, nrow = 2, ncol = 3))

si necesita ser más específico sobre el tipo de datos a continuación, pueden preferir: NA_integer_, NA_real_, NA_complex_, o NA_character_ en lugar de sólo NA lo cual es lógico

Otra cosa que puede ser más específica que la NAs es:

data.frame(matrix(vector(mode = 'numeric',length = 6), nrow = 2, ncol = 3))

donde el modo puede ser de cualquier tipo. Ver ?vector

+2

Esta es la forma en que generalmente lo hago. – Hansi

2

que podría ayudar a la solución dada en otro foro, Básicamente es: decir

Cols <- paste("A", 1:5, sep="") 
DF <- read.table(textConnection(""), col.names = Cols,colClasses = "character") 

> str(DF) 
'data.frame': 0 obs. of 5 variables: 
$ A1: chr 
$ A2: chr 
$ A3: chr 
$ A4: chr 
$ A5: chr 

se puede cambiar el colClasses para adaptarse a sus necesidades.

enlace original es https://stat.ethz.ch/pipermail/r-help/2008-August/169966.html

7

Usted puede utilizar en lugar de NULLNA. Esto crea un marco de datos realmente vacío.

+0

Esta es, de lejos, la respuesta más simple. Sigue siendo agnóstico sobre el tipo de datos de la columna, y no crea una primera fila por defecto como lo hacen algunas de las otras respuestas. – rsoren

+0

Quizás quiso decir NULL en la matriz(). Se produjo un error en la matriz (NULL, nrow = 0, ncol = 3): 'data' debe ser de un tipo de vector, era 'NULL' –

1

Un método más general para crear una trama de datos de tamaño arbitrario es crear una trama de datos n-by-1 a partir de una matriz de la misma dimensión.A continuación, se puede eliminar de inmediato la primera fila:

> v <- data.frame(matrix(NA, nrow=1, ncol=10)) 
> v <- v[-1, , drop=FALSE] 
> v 
[1] X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 
<0 rows> (or 0-length row.names) 
+4

En lugar de soltar la primera fila, podría crear la matriz con 'nrow = 0 ' – ping

5
df = data.frame(matrix("", ncol = 3, nrow = 10) 
+1

mejor use" NA "en lugar de" "mientras crea el df. de lo contrario, todas las columnas son un Factor con un nivel. – Jens

+0

Gran solución, pero se pierde un final extra ')'. Y como realmente no me gustan los factores, utilizo tibbles: 'dplyr :: as_tibble (matrix (NA, ncol = 3, nrow = 10))'. Puede usar 'NA_character_' y' NA_integer' etc. para forzar un tipo de datos. –

0

Si sólo los nombres de las columnas están disponibles como:

cnms <- c("Nam1","Nam2","Nam3") 

Para crear una trama de datos vacía con los nombres de las variables anteriores, en primer lugar crear un objeto de data.frame:

emptydf <- data.frame() 

ahora la palabra elemento cero de cada columna, creando de este modo una trama de datos vacío con los nombres de las variables dadas:

for(i in 1:length(cnms)){ 
    emptydf[0,eval(cnms[i])] 
} 
0

seq_along puede ayudar a saber cuántas filas del archivo de datos y crear un hoja.de.datos con el número deseado de filas

listdf <- data.frame(ID=seq_along(df), 
           var1=seq_along(df), var2=seq_along(df)) 
0

Aquí una solución si quieres una trama de datos vacía con un número determinado de filas y columnas: NO

df = data.frame(matrix(NA, ncol=1, nrow=10)[-1] 
Cuestiones relacionadas