2011-08-19 29 views
5

Estoy tratando de compilar datos de varios archivos utilizando for loops en R. Me gustaría obtener todos los datos en una tabla. El siguiente cálculo es solo un ejemplo.Loops R: Agregar una columna a una tabla si ya no existe

library(reshape) 

dat1 <- data.frame("Specimen" = paste("sp", 1:10, sep=""), "Density_1" = rnorm(10,4,2), "Density_2" = rnorm(10,4,2), "Density_3" = rnorm(10,4,2)) 
dat2 <- data.frame("Specimen" = paste("fg", 1:10, sep=""), "Density_1" = rnorm(10,4,2), "Density_2" = rnorm(10,4,2)) 

dat <- c("dat1", "dat2") 
for(i in 1:length(dat)){ 
data <- get(dat[i]) 
melt.data <- melt(data, id = 1) 
assign(paste(dat[i], "tbl", sep=""), cast(melt.data, ~ variable, mean)) 
} 

rbind(dat1tbl, dat2tbl) 

¿Cuál es la forma más sencilla de agregar una columna extra en dat2? Me gustaría obtener el mismo nombre de columna ("Density_3" en este caso) y llenarlo con ceros, si aún no existe. Supongamos que tengo ~ 100 mesas con número de columnas (Density_1, 2, 3, etc.) que varía entre 5 y 6.

Probé siguiente, pero no funcionó:

if(names(data) %in% "Density_3" == FALSE){ 
dat.all$Density_3 <- 0 
} else { 
dat.all$Density_3 <- dat.all$Density3} 

Otra: ¿hay una manera fácil de rbind() las tablas? Parece que rbind (get (dat)) no funciona.

Respuesta

3

Después de mirar esta pregunta por un momento, creo que su intención puede haber sido oscurecida por las innecesarias manipulaciones get y assign. Y creo que la respuesta es pylr::rbind.fill

Yo he construido "dat", no como un vector de caracteres, sino como una lista de dos tramas de datos, utilizado aggregate(..., FUN=mean) (porque no he conseguido en el autobús reshape2/plyr, a excepción de melt y rbind.fill) y luego do.call(rbind.fill, ...) en la lista resultante. En cualquier caso, esto es lo que creo que quieres. No creo que sea una buena idea agregar ceros para los valores que realmente faltan.

> rbind.fill(dat1tbl, dat2tbl) 
    value Density_1 Density_2 Density_3 
1 (all) 5.006709 4.088988 2.958971 
2 (all) 4.178586 3.812362  NA 
+0

No sabía nada del comando rbind.fill(). Esa es la que he estado buscando. ¡Gracias! – Largh

Cuestiones relacionadas