2011-08-19 8 views
5

Próbuję skompilować dane z kilku plików przy użyciu pętli w R. Chciałbym, aby wszystkie dane w jednej tabeli. Poniższe obliczenia to tylko przykład.R pętle: Dodawanie kolumny do tabeli, jeśli jeszcze nie istnieje

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) 

Jaki jest najłagodniejszy sposób na dodanie dodatkowej kolumny do dat2? Chciałbym uzyskać tę samą nazwę kolumny ("Density_3" w tym przypadku) i uzupełnić ją zerami, jeśli jeszcze nie istnieje. Załóżmy, że mam ~ 100 tabel z wielu kolumn (Density_1, 2, 3 itd) wahającej się pomiędzy 5 a 6.

Próbowałem następujących, ale to nie działa:

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

jeszcze jeden: Czy istnieje gładka droga do rbind() tabel? Wygląda na to, że rbind (get (dat)) nie działa.

Odpowiedz

3

Po tym, jak wpatrywał się w to pytanie przez chwilę, myślę, że jego intencje mogły zostać zasłonięte przez niepotrzebne manipulacje get i assign. I myślę, że odpowiedź jest pylr::rbind.fill

bym skonstruowane „DAT”, a nie jako wektor znaków ale jako lista dwóch dataframes, używane aggregate(..., FUN=mean) (bo nie dostał w autobusie reshape2/plyr, z wyjątkiem melt i rbind.fill która jest), a następnie do.call(rbind.fill, ...) na wynikowej liście. W każdym razie to jest to, co myślę, że chcesz. Nie sądzę, że dobrym pomysłem jest dodawanie zer w przypadku tak naprawdę brakujących wartości.

> 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

Nie wiedział o komendzie rbind.fill(). Tego właśnie szukałem. Dzięki! – Largh