[R-sig-Geo] melt spatialPixelDataFrame

Michael Sumner mdsumner at gmail.com
Thu Jul 19 03:39:20 CEST 2012


The culprit in raster_2.0-08 is in R/as.data.frame.R

setMethod('as.data.frame', signature(x='SpatialPoints'),

and the relevant usage is in (raster's) ?as.data.frame "Get a
data.frame with raster cell values, or coerce a SpatialPolygons,
Lines, or Points file to a data.frame"

 ## S4 method for signature 'SpatialPoints'
     as.data.frame(x, row.names=NULL, optional=FALSE, xy=FALSE, ...)


So, you can get similar to the sp behaviour if you use xy = TRUE, but
note that this is a completely different pathway and logic to the way
the sp:::as.data.frame.SpatialPixelsDataFrame works (it passes the job
to sp:::as.data.frame.SpatialPointsDataFrame).

library(sp)
data(meuse.grid)
m = SpatialPixelsDataFrame(points = meuse.grid[c("x", "y")], data = meuse.grid)
head(as.data.frame(m))

library(raster)
as.data.frame(m, xy = TRUE)
  object      x      y    x.1    y.1 part.a part.b      dist soil ffreq
1      1 181180 333740 181180 333740      1      0 0.0000000    1     1
2      2 181140 333700 181140 333700      1      0 0.0000000    1     1
...

I haven't followed the trail to where the "object" column is removed
again when using as.data.frame(m) with raster loaded.

raster introduces as.data.frame as a generic, with methods for
SpatialPoints, SpatialLines and SpatialPolygons, and the
SpatialPixelsDataFrame must get captured by the "SpatialPoints" one,
which has checks for the @data slot, which seems like a catch-all that
breaks the sp model. Summary is, if you use raster you accept a
completely different paradigm that you might be used to with sp.

Cheers, Mike.

On Thu, Jul 19, 2012 at 12:59 AM, Michael Sumner <mdsumner at gmail.com> wrote:
> Right, sure enough I got the x.1 and y.1 as per my first reply with
> raster 1.9-92, but after update to 2.0-08 I get your results without
> them. And, to be sure, see my run in a fresh session.
>
> I need to explore more to understand this, but things should work as
> expected with sp if you don't load raster (for now).
>
> Robert? Sorry I'm not familiar enough with raster to hunt this down
> easily, so I thought I'd raise it.
>
> Cheers, Mike.
>
> Code to run:
>
>
> library(sp)
> data(meuse.grid)
> m = SpatialPixelsDataFrame(points = meuse.grid[c("x", "y")], data = meuse.grid)
> head(as.data.frame(m))
>
>
>
> library(raster)
> head(as.data.frame(m))
>
>
>
> Session:
>
>> library(sp)
>> data(meuse.grid)
>> m = SpatialPixelsDataFrame(points = meuse.grid[c("x", "y")], data = meuse.grid)
>
>> head(as.data.frame(m))
>        x      y part.a part.b      dist soil ffreq    x.1    y.1
> 1 181180 333740      1      0 0.0000000    1     1 181180 333740
> 2 181140 333700      1      0 0.0000000    1     1 181140 333700
> 3 181180 333700      1      0 0.0122243    1     1 181180 333700
> 4 181220 333700      1      0 0.0434678    1     1 181220 333700
> 5 181100 333660      1      0 0.0000000    1     1 181100 333660
> 6 181140 333660      1      0 0.0122243    1     1 181140 333660
>>
>>
>>
>> library(raster)
> raster 2.0-08 (27-June-2012)
>> head(as.data.frame(m))
>        x      y part.a part.b      dist soil ffreq
> 1 181180 333740      1      0 0.0000000    1     1
> 2 181140 333700      1      0 0.0000000    1     1
> 3 181180 333700      1      0 0.0122243    1     1
> 4 181220 333700      1      0 0.0434678    1     1
> 5 181100 333660      1      0 0.0000000    1     1
> 6 181140 333660      1      0 0.0122243    1     1
>>
>> sessionInfo()
> R version 2.15.1 Patched (2012-06-29 r59683)
> Platform: x86_64-pc-mingw32/x64 (64-bit)
>
> locale:
> [1] LC_COLLATE=English_Australia.1252  LC_CTYPE=English_Australia.1252
> [3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
> [5] LC_TIME=English_Australia.1252
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  compiler  methods
> [8] base
>
> other attached packages:
> [1] raster_2.0-08 sp_0.9-99
>
> loaded via a namespace (and not attached):
> [1] grid_2.15.1    lattice_0.20-6 tools_2.15.1
>
>
>
>
>
> On Wed, Jul 18, 2012 at 11:48 PM, Johannes Radinger <JRadinger at gmx.at> wrote:
>> Hi,
>>
>>> > I tried:
>>> > 1) to transform the SPDF to a normal dataframe with as.data.frame(spdf)
>>> but then I loose my x and y columns. Thus I can't use them in melt. Was
>>> that behavior changed recently?
>>>
>>> No, I really don't think so. Are you sure?  Here x.1 and y.1 are the
>>> (re-attached) grid point coordinates, which incidentally are copies of
>>> the original data "x" and "y".
>>>
>>> data(meuse.grid)
>>> m = SpatialPixelsDataFrame(points = meuse.grid[c("x", "y")], data =
>>> meuse.grid)
>>> head(as.data.frame(m))
>>>        x      y part.a part.b      dist soil ffreq    x.1    y.1
>>> 1 181180 333740      1      0 0.0000000    1     1 181180 333740
>>> 2 181140 333700      1      0 0.0000000    1     1 181140 333700
>>> 3 181180 333700      1      0 0.0122243    1     1 181180 333700
>>
>> I am not 100% sure but my output looks different from yours (I am missing x.1 and y.1, the original coords from the SPDF and not the re-attached ones)
>> Here the output with the same example and sessionInfo():
>>
>>> library(raster)
>> Loading required package: sp
>> raster 2.0-08 (27-June-2012)
>>> data(meuse.grid)
>>> m = SpatialPixelsDataFrame(points = meuse.grid[c("x", "y")], data = meuse.grid)
>>> head(as.data.frame(m))
>>        x      y part.a part.b      dist soil ffreq
>> 1 181180 333740      1      0 0.0000000    1     1
>> 2 181140 333700      1      0 0.0000000    1     1
>> 3 181180 333700      1      0 0.0122243    1     1
>> 4 181220 333700      1      0 0.0434678    1     1
>> 5 181100 333660      1      0 0.0000000    1     1
>> 6 181140 333660      1      0 0.0122243    1     1
>>> sessionInfo()
>> R version 2.14.1 (2011-12-22)
>> Platform: i686-pc-linux-gnu (32-bit)
>>
>> locale:
>>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
>>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
>>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
>>  [7] LC_PAPER=C                 LC_NAME=C
>>  [9] LC_ADDRESS=C               LC_TELEPHONE=C
>> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
>>
>> attached base packages:
>> [1] stats     graphics  grDevices utils     datasets  methods
>> [7] base
>>
>> other attached packages:
>> [1] raster_2.0-08 sp_0.9-99
>>
>> loaded via a namespace (and not attached):
>> [1] grid_2.14.1    lattice_0.20-0 tools_2.14.1
>>
>>
>>
>>
>> Any idea?
>>
>> /johannes
>
>
>
> --
> Michael Sumner
> Hobart, Australia
> e-mail: mdsumner at gmail.com



-- 
Michael Sumner
Hobart, Australia
e-mail: mdsumner at gmail.com



More information about the R-sig-Geo mailing list