[R-br] Popular um data.frame em dois loops

Thiago V. dos Santos thi_veloso em yahoo.com.br
Sexta Agosto 9 18:48:28 BRT 2013


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/index.htm
Phone: (612) 323 9898


________________________________
 From: Benilton Carvalho <beniltoncarvalho em gmail.com>
To: r-br <r-br em 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 em 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 em yahoo.com.br
> To: r-br em 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/index.htm
> Phone: (612) 323 9898
>
> _______________________________________________ R-br mailing list
> R-br em 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 em 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 em 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.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20130809/887a19e6/attachment.html>


Mais detalhes sobre a lista de discussão R-br