[R-sig-Geo] raster::zonal with more than 1 zonal layer

Dominik Schneider Dominik.Schneider at colorado.edu
Fri Mar 4 17:36:47 CET 2016


Thanks  Loïc
On Mar 3, 2016 11:15 AM, "Loïc Dutrieux" <loic.dutrieux at wur.nl> wrote:

>
>
> On 03/03/2016 05:19 PM, Dominik Schneider wrote:
>
>> That looks great, thanks!
>> to close the question:
>> b=as.data.frame(zonal(dat, zoneLayer, 'mean') )
>> full_join(u,b,by=c('newVal'='zone’))
>>
>> 1 question,
>> in this line: u <- data.frame(unique(s))
>> does unique(s) give all unique combinations in the 3rd dimension of the
>> stack? that’s a neat trick.
>>
>
> I'm not 100% sure, we can check with a simplified case.
>
> r1 <- r2 <- raster()
> n <- ncell(r1)
> r1[] <- c(rep(1, n/3), rep(2, n/3), rep(3, n/3))
> r2[] <- c(rep(4, n/2), rep(5, n/2))
> s <- stack(r1, r2)
> plot(s)
>
> unique(s)
>
> So yes, it looks like unique combinations in the 3rd dimension is what
> unique() returns in the case of a multilayer raster object.
>
> Cheers,
> Loïc
>
>
>> ds
>>
>>
>>
>> On Wed, Mar 02, 2016 at 3:24 AM "Loïc Dutrieux" <">"Loïc Dutrieux"
>> <mailto:>> wrote:
>>
>>
>>
>>     On 03/02/2016 01:48 AM, Dominik Schneider wrote:
>>      > I'd like to summarise a raster using elevation and watershed. I was
>>      > originally using extract() with a shape file and then each
>>     elevation band
>>      > within each polygon but it's very slow. zonal() is much faster
>>     and I can
>>      > rasterize my polygons to use it.
>>
>>     Is it really much faster? I sounds very similar to what extract() does
>>     under the hood.
>>
>>      > But how do I robustly combine multiple
>>      > rasterized shapefiles?
>>      > e.g.
>>      > dat=raster(matrix(runif(64),nrow=8))
>>      > z1=raster(matrix( sample(1:4, 64, replace=T),nrow=8))#represents
>>     elevation
>>      > bands
>>      > z2=raster(matrix(sample(1401:1408,64,replace=T),nrow=8))#represents
>>      > watersheds
>>      > zonal(dat,z1*z2,'mean')
>>      >
>>      > this works well if you are certain that each combination of the
>>     values in
>>      > z1 and z2 are unique and each combination is present. otherwise
>>     it gets
>>      > messy. are there any suggestions for this use case?
>>      > ideally one could do: zonal(dat,stack(z1,z2),'mean') and all the
>>      > bookkeeping would be taken care of.
>>
>>     What about:
>>
>>     s <- stack(z1, z2)
>>     u <- data.frame(unique(s))
>>     u$newVal <- seq(nrow(u))
>>     zoneLayer <- subs(s, u, by = 1:2, which = 3)
>>
>>     # Let's validate
>>     a <- zonal(dat,z1*z2,'mean')
>>     b <- zonal(dat, zoneLayer, 'mean')
>>     all.equal(b[order(b[,2]),2], a[order(a[,2]),2]) # TRUE
>>
>>     Cheers,
>>     Loïc
>>
>>      > my other thought is to extract all the
>>      > values into data frames and use dplyr but I was wondering if
>>     there was a
>>      > raster way to do this.
>>      > Thanks
>>      > Dominik
>>      >
>>      > [[alternative HTML version deleted]]
>>      >
>>      > _______________________________________________
>>      > R-sig-Geo mailing list
>>      > R-sig-Geo at r-project.org <mailto:R-sig-Geo at r-project.org>
>>      > https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>      >
>>
>>     _______________________________________________
>>     R-sig-Geo mailing list
>>     R-sig-Geo at r-project.org <mailto:R-sig-Geo at r-project.org>
>>     https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>
>>
>>

	[[alternative HTML version deleted]]



More information about the R-sig-Geo mailing list