On Sun, 15 Jul 2007, Tim Keitt wrote: > On 7/14/07, Roger Bivand <[EMAIL PROTECTED]> wrote: >> On Sat, 14 Jul 2007, Michal Gallay wrote: >> >> > Dear R Users, >> > >> > could you please advise me on doing map algebra with spatial grids? It's >> > the first time I am using spatial objects in R. I have imported an ascii >> > grid file and wanted to round the values in it or sum with a value, but >> > it >> > gives an error message: >> > >> > > require(maptools) >> > > x <- readAsciiGrid(fname="xxxx.asc") >> > > x+3 >> > Error in x + 3 : non-numeric argument to binary operator >> > > round(x,2) >> > Error in round(x, digits) : Non-numeric argument to mathematical >> > function >> > >> >> Arithmetic operations are not defined for SpatialGridDataFrame operations, >> as the columns of the data frame (here a single column) may contain data >> of different classes. Do the operations on the columns directly: >> >> names(x) >> >> If there is a column called "band1", then >> >> x$band1 + 3 >> >> will print "band1" + 3, and >> >> x$band1 <- x$band1 + 3 >> >> will add 3 to the "band1" column. Think what would happen if band1 was >> categorical or logical to see why doing arithmetic directly isn't such a >> good idea. > > Roger, > > While I agree that arithmetic directly on S?DF objects does not make a > lot of sense, I have always taken the view that if the name of a type > includes "data frame", then you are implicitly promising that the > object is substitutable for any other data.frame class object in a > function call. So if S?DF is meant to inherit (formally or informally) > from data.frame, one should be able to use a S?DF anywhere you could > use an ordinary data.frame object without changing the result. Of > course, I realize that S?DF is not mean to inherit directly from > data.frame (so it is clear from the programming standpoint, ie there > is no "inherits" relationship between data.frame and S?DF). Perhaps it > would be more clear to users if a different naming scheme were used?
Tim, While there is something in your suggestion, my understanding of the White Book (1992) introduction of data frames is that they are lists of vectors of varying types but of equal lengths, and that they should play well with formulae. The current Spatial*DataFrame do indeed do this, and you can use them with model.frame() inside for example lm(), gstat(), and generally almost everywhere a real data frame is needed as a data= argument. I cannot recall ever using an arithmetic operation on a data frame myself, although I may be an exception (I coerse to matrix). Rather than trying to inherit from data.frame, the methods ($,[, [[, and assignment versions) provide data.frame operability. Certainly I can see that there are differences of approach here, especially if remote sensing data are never going to have factors (unlike say GIS integration, where categorical data do occur). The exchange on the list earlier today (about why read.table() returns a data.frame and by default converts a character vector to a factor) seems to back me up (from my point of view, of course!). Best wishes, Roger > > THK > >> >> Hope this helps, >> >> Roger >> >> > Thank you for any suggestions. >> > >> > Best wishes, >> > >> > Michal >> > >> > >> > >> > >> >> -- >> Roger Bivand >> Economic Geography Section, Department of Economics, Norwegian School of >> Economics and Business Administration, Helleveien 30, N-5045 Bergen, >> Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43 >> e-mail: [EMAIL PROTECTED] >> >> _______________________________________________ >> R-sig-Geo mailing list >> R-sig-Geo@stat.math.ethz.ch >> https://stat.ethz.ch/mailman/listinfo/r-sig-geo >> > > > -- Roger Bivand Economic Geography Section, Department of Economics, Norwegian School of Economics and Business Administration, Helleveien 30, N-5045 Bergen, Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43 e-mail: [EMAIL PROTECTED] _______________________________________________ R-sig-Geo mailing list R-sig-Geo@stat.math.ethz.ch https://stat.ethz.ch/mailman/listinfo/r-sig-geo