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

#r #dplyr #statistics #r-raster

#r #dplyr #Статистика #r-растр

Вопрос:

Я хочу применить вычисления (сумму) к стеку растров (содержит несколько слоев) в соответствии с группами другого стека растров (идентификация групп варьируется от одного пиксельного временного ряда к другому). Вот мой пример:

 library(raster)
#1. Create raster stack "values" (rs)
set.seed(193473)
r1 <- raster(nrows = 10, ncols = 10)
r2=r3=r4=r5=r6=r7=r8=r9=r10=r11=r12=r13=r1

r1[] <- rbinom(ncell(r1), 60, prob = .1)
r2[] <- rbinom(ncell(r1), 50, prob = .1)
r3[] <- rbinom(ncell(r1), 70, prob = .1)
r4[] <- rbinom(ncell(r1), 90, prob = .1)

r5[] <- rbinom(ncell(r1), 70, prob = .1)
r6[] <- rbinom(ncell(r1), 60, prob = .1)
r7[] <- rbinom(ncell(r1), 80, prob = .1)
r8[] <- rbinom(ncell(r1), 90, prob = .1)

r9[] <- rbinom(ncell(r1), 60, prob = .1)
r10[] <- rbinom(ncell(r1), 70, prob = .1)
r11[] <- rbinom(ncell(r1), 90, prob = .1)
r12[] <- rbinom(ncell(r1), 70, prob = .1)
r13[] <- rbinom(ncell(r1), 50, prob = .1)
  
rs <- stack(r1, r2, r3, r4,r5,r6,r7,r8,r9,r10,r11,r12,r13)
nlayers(rs)
plot(rs[[1]])
plot(rs)

#2, rs_flag

rc1=function(x1) {
  ifelse(x1>7,1,0)
}

rs_flag=overlay(rs,fun=rc1)
nlayers(rs_flag)
plot(rs_flag)

#3,  rs_id

rc3= function(x3) {
  rep(seq(1,length(rle(x3)$lengths)), rle(x3)$lengths)
}

rs_id=overlay(rs_flag,fun=rc3)

plot(rs_id)
  

Как извлечь максимальное значение (rs) стека растров в каждой группе стека растров (rs_id) и заменить другие значения той же группы на это максимальное значение?

Я объясняю свою проблему, см. Ниже Пример временных рядов в один пиксель :

 #extract values of one pixel ex. (x,y)=(4,7)
rsp=rs[4,7]
rsp

#rsp_id
rsp_id=rs_id[4,7]
rsp_id
  

Извлеките максимальное значение каждой группы стековых растров (rs_id) и замените другие значения той же группы на это максимальное значение.

 #table preparation  
tab1 <- t(rbind(rsp, rsp_id))
tab1

#rsp_max : max value of each group

library(dplyr)
   
tab2=tab1 %>%
     group_by(rsp_id) %>%
     mutate(rsp_max=max(rsp))

tab2
  

В конце я получаю результат ниже для одного пикселя (см. Таблицу ниже)

введите описание изображения здесь

Мой вопрос: как вычислить «rs_max» (стек растров), применяя описанную выше функцию между двумя стеками растров (rs и rs_id), используя «group_by» и «max» внутри функции

#Я пробую эту функцию, но она не работает!! :

 ##4# rs_id

library(dplyr)

rc4= function(x,y) {
  group_by(x) %>%
   max(y)
}



#Error in (function (x, fun, filename = "", recycle = TRUE, forcefun = FALSE,  : 
#cannot use this formula, probably because it is not vectorized
  

Заранее благодарим вас за помощь!

Ответ №1:

Я думаю, это поможет

 ff <- function(v) {
    x <- v[1:13]
    y <- v[14:26]
    a <- tapply(x, y, max) 
    b <- as.integer(names(a))
    as.vector(a[match(y, b)])
}

ff(as.vector(tab1))

rs_max <- calc(stack(rs, rs_id), fun=ff)
rs_max[4,7]
  

Комментарии:

1. Большое спасибо Роберту Хиджмансу за ваш ответ. Функция работает очень хорошо. Спасибо за эту идею: сложите два стека растров и используйте tapply.

2. В вашем ответе выше можно ли использовать функцию «cumsum» для другого вычисления, но без повторения значений в каждой группе. Большое спасибо!