Popular um data.frame em dois loops

Pessoal, Estou fazendo um loop para variáveis (tair, tsoil, biomass, lai) e dentro desse loop estou fazendo outro com anos (2005, 2006, 2007) etc. Ao final dos dois loops, gostaria de ter um data.frame assim:
d var date value 1 tair 2005-01-01 10 2 tair 2006-01-01 20 3 tair 2007-01-01 30 4 tair 2008-01-01 40 5 tsoil 2005-01-01 10
6 tsoil 2006-01-01 20 7 tsoil 2007-01-01 30 8 tsoil 2008-01-01 40 etc etc Qual é o meio mais eficiente para fazer isso? Talvez até exista uma forma mais rápida de fazer isso do que usar loops, então qualquer sugestão será muito bem-vinda. Segue o CMR (que não está eficiente, é só para fins de compreensão do problema): ------------------------------------------------------------------------------------------------------------- library(raster) # Create random rasterstack and set names r1 <- r2 <- r3 <- r4 <- raster(nrow = 50, ncol = 100) r1[] <- 10 r2[] <- 20 r3[] <- 30 r4[] <- 40 s <- stack(r1, r2, r3, r4) # Set years names(s) <- c('X2005.01.01', 'X2006.01.01', 'X2007.01.01', 'X2008.01.01') # Create random variable names vars <- c('tempsoi', 'tempair', 'biomass', 'lai') for( i in 1:length (vars) ) { # Loop over years (names), extract raster average values and put in the data.frame d <- NULL for ( j in 1:length (names(s)) ) { var <- vars[i] date <- format (as.Date (gsub (pattern='\\.', replacement='-', substring (names(s)[j],2)))) value <- mean (getValues (s[[j]]), na.rm = TRUE) d <- rbind (d, data.frame(var, date, value)) } # end loop over names } # end loop vars ------------------------------------------------------------------------------------------------------------- Saudações, -- Thiago V. dos Santos PhD student Land and Atmospheric Science University of Minnesota http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/inde... Phone: (612) 323 9898

Tente usar o for(). Att. Tiago. ################################################################# Tiago de Souza Marçal - Graduando em Agronomia pelo CCA-UFES Bolsista de Iniciação Científica da área de Genética e Melhoramento de Plantas ################################################################# Date: Fri, 9 Aug 2013 08:44:26 -0700 From: thi_veloso@yahoo.com.br To: r-br@listas.c3sl.ufpr.br Subject: [R-br] Popular um data.frame em dois loops Pessoal, Estou fazendo um loop para variáveis (tair, tsoil, biomass, lai) e dentro desse loop estou fazendo outro com anos (2005, 2006, 2007) etc. Ao final dos dois loops, gostaria de ter um data.frame assim:
d var date value1 tair 2005-01-01 102 tair 2006-01-01 203 tair 2007-01-01 304 tair 2008-01-01 405 tsoil 2005-01-01 10 6 tsoil 2006-01-01 207 tsoil 2007-01-01 308 tsoil 2008-01-01 40etcetc Qual é o meio mais eficiente para fazer isso? Talvez até exista uma forma mais rápida de fazer isso do que usar loops, então qualquer sugestão será muito bem-vinda. Segue o CMR (que não está eficiente, é só para fins de compreensão do problema): -------------------------------------------------------------------------------------------------------------library(raster)
# Create random rasterstack and set namesr1 <- r2 <- r3 <- r4 <- raster(nrow = 50, ncol = 100)r1[] <- 10r2[] <- 20r3[] <- 30r4[] <- 40s <- stack(r1, r2, r3, r4) # Set yearsnames(s) <- c('X2005.01.01', 'X2006.01.01', 'X2007.01.01', 'X2008.01.01') # Create random variable namesvars <- c('tempsoi', 'tempair', 'biomass', 'lai') for( i in 1:length (vars) ) { # Loop over years (names), extract raster average values and put in the data.frame d <- NULL for ( j in 1:length (names(s)) ) { var <- vars[i] date <- format (as.Date (gsub (pattern='\\.', replacement='-', substring (names(s)[j],2)))) value <- mean (getValues (s[[j]]), na.rm = TRUE) d <- rbind (d, data.frame(var, date, value)) } # end loop over names } # end loop vars ------------------------------------------------------------------------------------------------------------- Saudações, -- Thiago V. dos Santos PhD student Land and Atmospheric Science University of Minnesota http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/inde... Phone: (612) 323 9898 _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.

realmente nao entendi 100% do q vc quer fazer, mas sera' que o seguinte nao seria suficiente? v1 = c('tair', 'tsoil', 'biomass', 'lai') v2 = 2005:2007 v3 = seq(10, 40, 10) expand.grid(var=v1, ano=v2, value=v3) ? Em 9 de agosto de 2013 13:09, Tiago Souza Marçal <tiagosouzamarcal@hotmail.com> escreveu:
Tente usar o for().
Att.
Tiago.
#################################################################
Tiago de Souza Marçal - Graduando em Agronomia pelo CCA-UFES
Bolsista de Iniciação Científica da área de Genética e Melhoramento de Plantas
#################################################################
________________________________ Date: Fri, 9 Aug 2013 08:44:26 -0700 From: thi_veloso@yahoo.com.br To: r-br@listas.c3sl.ufpr.br Subject: [R-br] Popular um data.frame em dois loops
Pessoal,
Estou fazendo um loop para variáveis (tair, tsoil, biomass, lai) e dentro desse loop estou fazendo outro com anos (2005, 2006, 2007) etc.
Ao final dos dois loops, gostaria de ter um data.frame assim:
d var date value 1 tair 2005-01-01 10 2 tair 2006-01-01 20 3 tair 2007-01-01 30 4 tair 2008-01-01 40 5 tsoil 2005-01-01 10 6 tsoil 2006-01-01 20 7 tsoil 2007-01-01 30 8 tsoil 2008-01-01 40 etc etc
Qual é o meio mais eficiente para fazer isso?
Talvez até exista uma forma mais rápida de fazer isso do que usar loops, então qualquer sugestão será muito bem-vinda.
Segue o CMR (que não está eficiente, é só para fins de compreensão do problema):
------------------------------------------------------------------------------------------------------------- library(raster)
# Create random rasterstack and set names r1 <- r2 <- r3 <- r4 <- raster(nrow = 50, ncol = 100) r1[] <- 10 r2[] <- 20 r3[] <- 30 r4[] <- 40 s <- stack(r1, r2, r3, r4)
# Set years names(s) <- c('X2005.01.01', 'X2006.01.01', 'X2007.01.01', 'X2008.01.01')
# Create random variable names vars <- c('tempsoi', 'tempair', 'biomass', 'lai')
for( i in 1:length (vars) ) {
# Loop over years (names), extract raster average values and put in the data.frame d <- NULL
for ( j in 1:length (names(s)) ) { var <- vars[i] date <- format (as.Date (gsub (pattern='\\.', replacement='-', substring (names(s)[j],2)))) value <- mean (getValues (s[[j]]), na.rm = TRUE) d <- rbind (d, data.frame(var, date, value)) } # end loop over names
} # end loop vars
-------------------------------------------------------------------------------------------------------------
Saudações, -- Thiago V. dos Santos PhD student Land and Atmospheric Science University of Minnesota http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/inde... Phone: (612) 323 9898
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Para que voê entenda o meu problema (ou pelo menos tente), vou mandar o código total. Já aviso que é um pouco complicado lol. Basicamente, o primeiro loop é nas variáveis e o segundo loop é nos anos. O problema que eu mencionei no tópico ocorre no data.frame tmp.df1 Veja abaixo o código: ------------------------------------------------------------------------------------------ #!/usr/bin/ Rscript # Load required packages library(raster) library(ncdf4) library(ggplot2) # Download and load data url=('http://dl.dropboxusercontent.com/u/27700634/yearly.nc') download.file(url, destfile = "yearly.nc") f <- ('yearly.nc') nc <- nc_open (f) vars <- names(nc$var) # First, loop over all variables for( i in 2:nc$nvars ) { v <- nc$var[[i]] if (v$ndims < 4) { # Only do if the variable has three dimensions # Load files s <- stack(f, varname=v$name) # Create empty data.frame tmp.df1 <- data.frame(g=1, date=rep(NA, length(names(s))), values=NA) # Loop over years (names), average raster values and put in the data.frame for ( j in 1:length(names(s)) ) { tmp.df1$date[j] <- format(as.Date(gsub(pattern='\\.', replacement='-', substring (names(s)[j],2)))) tmp.df1$values[j] <- mean(getValues(s[[j]]), na.rm = TRUE) } # end loop over names # plot data p <- ggplot(tmp.df1, aes(x=date, y=values, group=g)) print(p + geom_line() + theme_bw() + labs(title = v$name) + # add title labs(x= 'Year', y= v$units) ) # change axis names } # endif three dimensions else { # Only do if the variable has four dimensions # Load PFT's/year. Note that in this case, level= # of year and the PFTs are the names? # Hence, solution would be looping over levels for YEAR and loop over names for PFT's? b1 <- brick(f, varname=v$name, level=1, lvar=4) b2 <- brick(f, varname=v$name, level=2, lvar=4) b3 <- brick(f, varname=v$name, level=3, lvar=4) b4 <- brick(f, varname=v$name, level=4, lvar=4) s <- stack (b1, b2, b3, b4) # <- this DON'T work!! # Create empty data.frame #tmp.df2 <- data.frame(g=1, date=rep(NA, length(names(b))), values=NA) # Loop over years (names), extract raster mean values and put in the data.frame #for ( k in 1:length(names(b)) ) { #tmp.df1$date[k] <- #tmp.df2$values[k] <- mean(getValues(b[[k]]), na.rm = TRUE) #} # end loop over dimensions } # endif four dimensions } # end loop over variables ------------------------------------------------------------------------------------------ Saudações, -- Thiago V. dos Santos PhD student Land and Atmospheric Science University of Minnesota http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/inde... Phone: (612) 323 9898 ________________________________ From: Benilton Carvalho <beniltoncarvalho@gmail.com> To: r-br <r-br@listas.c3sl.ufpr.br> Sent: Friday, August 9, 2013 12:21 PM Subject: Re: [R-br] Popular um data.frame em dois loops realmente nao entendi 100% do q vc quer fazer, mas sera' que o seguinte nao seria suficiente? v1 = c('tair', 'tsoil', 'biomass', 'lai') v2 = 2005:2007 v3 = seq(10, 40, 10) expand.grid(var=v1, ano=v2, value=v3) ? Em 9 de agosto de 2013 13:09, Tiago Souza Marçal <tiagosouzamarcal@hotmail.com> escreveu:
Tente usar o for().
Att.
Tiago.
#################################################################
Tiago de Souza Marçal - Graduando em Agronomia pelo CCA-UFES
Bolsista de Iniciação Científica da área de Genética e Melhoramento de Plantas
#################################################################
________________________________ Date: Fri, 9 Aug 2013 08:44:26 -0700 From: thi_veloso@yahoo.com.br To: r-br@listas.c3sl.ufpr.br Subject: [R-br] Popular um data.frame em dois loops
Pessoal,
Estou fazendo um loop para variáveis (tair, tsoil, biomass, lai) e dentro desse loop estou fazendo outro com anos (2005, 2006, 2007) etc.
Ao final dos dois loops, gostaria de ter um data.frame assim:
d var date value 1 tair 2005-01-01 10 2 tair 2006-01-01 20 3 tair 2007-01-01 30 4 tair 2008-01-01 40 5 tsoil 2005-01-01 10 6 tsoil 2006-01-01 20 7 tsoil 2007-01-01 30 8 tsoil 2008-01-01 40 etc etc
Qual é o meio mais eficiente para fazer isso?
Talvez até exista uma forma mais rápida de fazer isso do que usar loops, então qualquer sugestão será muito bem-vinda.
Segue o CMR (que não está eficiente, é só para fins de compreensão do problema):
------------------------------------------------------------------------------------------------------------- library(raster)
# Create random rasterstack and set names r1 <- r2 <- r3 <- r4 <- raster(nrow = 50, ncol = 100) r1[] <- 10 r2[] <- 20 r3[] <- 30 r4[] <- 40 s <- stack(r1, r2, r3, r4)
# Set years names(s) <- c('X2005.01.01', 'X2006.01.01', 'X2007.01.01', 'X2008.01.01')
# Create random variable names vars <- c('tempsoi', 'tempair', 'biomass', 'lai')
for( i in 1:length (vars) ) {
# Loop over years (names), extract raster average values and put in the data.frame d <- NULL
for ( j in 1:length (names(s)) ) { var <- vars[i] date <- format (as.Date (gsub (pattern='\\.', replacement='-', substring (names(s)[j],2)))) value <- mean (getValues (s[[j]]), na.rm = TRUE) d <- rbind (d, data.frame(var, date, value)) } # end loop over names
} # end loop vars
-------------------------------------------------------------------------------------------------------------
Saudações, -- Thiago V. dos Santos PhD student Land and Atmospheric Science University of Minnesota http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/inde... Phone: (612) 323 9898
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a c�digo m�nimo reproduz�vel.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
participantes (3)
-
Benilton Carvalho
-
Thiago V. dos Santos
-
Tiago Souza Marçal