Hi, I would like to add layers to a spatraster (terra), by matching (joining) a column in a data frame with the values of the raster layer (A). Then, I would like to make it a spatio-temporal terra spatraster and/or a stars (B).
Any help will be strongly appreciated, Kind regards, M. ________________________________________ require(terra) # A) # runnable example # Make an example raster: r = terra::rast(ncols=10, nrows=10) values(r) <- 1:100 names(r)="ID" # add some missing values (to make it real) r[c(2,43,60,94)]=NA plot(r) # Make an example data frame (note both have an ID col to match) d <- data.frame( ID=100:1, k=c("aa","bb"), e=rnorm(100,2), year=sample(2001:2002, 100, replace = TRUE), date= as.Date(rep(c("2010-01-01", "2012-02-01", "2010-03-01","2010-04-01"), l=100))) head(d) # My tries: # 1. This works, but only for one col and it is not so nice: r$year2 <- d$year[match(as.vector(r$ID), d$ID)] plot(r) # 2. try it using app function: I could not make it work kk1 <- function(i,j=d) { j[match(as.vector(i$ID), j$ID),] } app(r, fun = kk1) # 3. try it using classify function # works with numeric (not characters) but it is not perfect terra::classify(r, d) # error # two numeric cols: works, but add the second col as the first raster col. Not ok. terra::classify(r, d[,c(1,3)]) # excluding the character col: gives an error terra::classify(r, d[,-c(2)]) # 4. try it using merge function terra::merge(r, d) %>% head() #not sure what he did and in which order :( but clearly not match/join working properly # 5. only (not elegant) way I managed: rast( left_join( as_tibble(r, xy=TRUE), d, by="ID"), type="xyz", crs = "EPSG:4326") %>% plot() # B) Make terra r raster a spatiotemporal cube # 1. # https://stackoverflow.com/questions/74079441/group-raster-files-by-week-month terra::time(r, tstep="years") <- d$year # gives an error... # Error: [time<-] length(value) != nlyr(x) # 2. # https://stackoverflow.com/questions/74934891/specifying-layers-when-using-rast-type-xyz-to-convert-data-frame-to-spatra # but I think this is not really a spatio-temporal rast... d2 <- left_join(as_tibble(r, xy=TRUE), d, by=c("ID")) w <- reshape(d2, timevar="year", idvar=c("x", "y"), direction="wide") x <- rast(w, type="xyz") # by year d3 <- split(d2[,-7], d2$year) r2 <- lapply(d3, \(i) rast(i, type="xyz")) (r2 <- rast(r2)) time(r2) <- as.Date(names(r2)) plot(r2) # plot with rasterVis require(rasterVis) levelplot(r2) # 2. using stars (aternative) # sources: https://stackoverflow.com/questions/77368957/how-to-transform-a-sf-table-to-a-stars-cube-with-starsst-as-stars-function # ( https://gis.stackexchange.com/questions/353741/generate-a-stars-object-from-tabular-spatial-temporal-data ): s <- st_as_stars(as.data.frame(r, xy = TRUE, na.rm = TRUE), dims = c("x", "y", "year"), crs = 4326) s %>% plot(axes=TRUE) # but the from and to of the year are wrong # How to change to spatrast again? [[alternative HTML version deleted]] _______________________________________________ R-sig-Geo mailing list R-sig-Geo@r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-geo