Есть ли способ упростить / зациклить поднаборы растрового стека? - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь упростить мой код.У меня есть растровый стек, составленный из 194 растровых слоев.Я хотел бы поднастроить это как ниже.Есть ли более простой способ сделать это?

stacked <- stack(example)

yr1 <- subset(stacked, 1:6)
yr2 <- subset(stacked, 7:18)
yr3 <- subset(stacked, 19:30)
yr4 <- subset(stacked, 31:42)
yr5 <- subset(stacked, 43:54)
yr6 <- subset(stacked, 55:66)
yr7 <- subset(stacked, 67:78)
yr8 <- subset(stacked, 79:90)
yr9 <- subset(stacked, 91:102)
yr10 <- subset(stacked, 103:114)
yr11 <- subset(stacked, 115:126)
yr12 <- subset(stacked, 127:138)
yr13 <- subset(stacked, 139:150)
yr14 <- subset(stacked, 151:162)
yr15 <- subset(stacked, 163:174)
yr16 <- subset(stacked, 175:186)
yr17 <- subset(stacked, 187:194)

Я ожидаю иметь 17 новых растровых стеков, каждый из которых содержит растровые слои, указанные выше.

Ответы [ 3 ]

2 голосов
/ 17 апреля 2019

Если интервалы класса не согласованы, и вам необходимо определить интервалы, то один из способов сделать это, как показано ниже:

library(raster)

#reproducible example
set.seed(987)

# setting up example raster stack
r1 <- raster(nrows = 1, ncols = 1, res = 0.5, xmn = -1.5, xmx = 1.5, ymn = -1.5, ymx = 1.5, vals = runif(36, 1, 5))
r.stack <- stack(lapply(1:20, function(i) setValues(r1,runif(ncell(r1)))))

#solution using a list
out <- list()
for (i in 1:5) {
  intervals <- c(1,4,7,11,16,21)
  s <- c(intervals[[i]]:intervals[[i+1]])
  out[[i]] <- subset(r.stack,s[1:length(s)-1]) #remove the last one as it doesnt belong to the class
}
1 голос
/ 17 апреля 2019

Поскольку ваши перерывы выглядят несколько равномерно, мы можем определить их с помощью seq и добавить специальные случаи:

breaks <- data.frame(lower=c(1,seq(7,175,12),187),upper=c(6,seq(18,186,12),194))
years <- lapply(1:nrow(breaks),function(x){return(subset(stacked,breaks[x,'lower']:breaks[x,'upper']))})
names(years) <- paste0("yr",1:nrow(breaks))
0 голосов
/ 17 апреля 2019

довольно громоздко иметь 17 объектов RasterStack, и, вероятно, не то, что вы должны делать (но если вы это сделаете, поместите их в список, как показано в Majid и Julian_Hn).Я не знаю, что вам следует делать, поскольку нет контекста, но вы могли бы создать такую ​​матрицу

yrs <- matrix( c(1,6,7,18,19,30,31,42,43,54,55,66,67,78,79,90,91,102,103,114,115,
            126,127,138,139,150,151,162,163,174,175,186,187,194), ncol=2, byrow=T)

, а затем извлечь нужный вам год при необходимости

yr10 <- stacked[[ yrs[10,1]:yrs[10,2] ]]

или

yr10 <- subset(stacked, yrs[10,1], yrs[10,2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...