R: Вычисление средних строк в зависимости от даты. tidyverse - PullRequest
1 голос
/ 23 марта 2020

Некоторые из вас помогают с этим вопросом через базу R, но я пытаюсь сделать это сейчас с аккуратными данными. Вот мой набор данных:

data <- tibble( "DATE_FIRE"= c("1989-07-31", "1989-07-31", "1989-07-31", "1989-07-31","1989-07-31","1989-08-31", "1989-08-31", "1989-08-31", "1989-08-31","1989-08-31"), 
       "FID_FIRE" = c(1,1,1,1,1,2,2,2,2,2),
       "date" = c("1988-01-01", "1989-01-01","1990-01-01","1991-06-07","1992-01-01", "1988-01-01", "1989-01-01","1990-01-01","1991-06-07","1992-01-01"),
       "NDVI" = c( 0.9, 0.8, 0.1, 0.2, 0.3, 0.8, 0.85, 0.15, 0.30, 0.50))
> data
# A tibble: 10 x 4
   DATE_FIRE  FID_FIRE date        NDVI
   <chr>         <dbl> <chr>      <dbl>
 1 1989-07-31        1 1988-01-01  0.9 
 2 1989-07-31        1 1989-01-01  0.8 
 3 1989-07-31        1 1990-01-01  0.1 
 4 1989-07-31        1 1991-06-07  0.2 
 5 1989-07-31        1 1992-01-01  0.3 
 6 1989-08-31        2 1988-01-01  0.8 
 7 198`enter code here`9-08-31        2 1989-01-01  0.85
 8 1989-08-31        2 1990-01-01  0.15
 9 1989-08-31        2 1991-06-07  0.3 
10 1989-08-31        2 1992-01-01  0.5 

Как видите, у меня есть даты 2 лесных участков, пожар 1 и пожар 2 (столбец FID_FIRE). DATE_FIRE сообщает нам, когда произошел пожар на каждом участке. У меня также есть данные в виде NDVI (параметры зелени) для этих участков до и после пожара (см. Столбцы date и NDVI).

Я бы хотел добавить для столбца вычисление для каждого графика среднего значения из NDVI до того, как произошел пожар . В случае FID_FIRE=1 это будет среднее значение NDVI значений row 1 и 2.

Выходные данные должны выглядеть следующим образом:

> desired_output
# A tibble: 10 x 5
   DATE_FIRE  FID_FIRE date        NDVI meanPrefire
   <chr>         <dbl> <chr>      <dbl>       <dbl>
 1 1989-07-31        1 1988-01-01  0.9        0.85 
 2 1989-07-31        1 1989-01-01  0.8        0.85 
 3 1989-07-31        1 1990-01-01  0.1        0.85 
 4 1989-07-31        1 1991-06-07  0.2        0.85 
 5 1989-07-31        1 1992-01-01  0.3        0.85 
 6 1989-08-31        2 1988-01-01  0.8        0.825
 7 1989-08-31        2 1989-01-01  0.85       0.825
 8 1989-08-31        2 1990-01-01  0.15       0.825
 9 1989-08-31        2 1991-06-07  0.3        0.825
10 1989-08-31        2 1992-01-01  0.5        0.825

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

Попробуйте:

library(dplyr)

data %>%
  group_by(FID_FIRE) %>%
  mutate(meanPrefire = mean(NDVI[date < DATE_FIRE], na.rm = TRUE))

Вывод:

# A tibble: 10 x 5
# Groups:   FID_FIRE [2]
   DATE_FIRE  FID_FIRE date        NDVI meanPrefire
   <chr>         <dbl> <chr>      <dbl>       <dbl>
 1 1989-07-31        1 1988-01-01  0.9        0.85 
 2 1989-07-31        1 1989-01-01  0.8        0.85 
 3 1989-07-31        1 1990-01-01  0.1        0.85 
 4 1989-07-31        1 1991-06-07  0.2        0.85 
 5 1989-07-31        1 1992-01-01  0.3        0.85 
 6 1989-08-31        2 1988-01-01  0.8        0.825
 7 1989-08-31        2 1989-01-01  0.85       0.825
 8 1989-08-31        2 1990-01-01  0.15       0.825
 9 1989-08-31        2 1991-06-07  0.3        0.825
10 1989-08-31        2 1992-01-01  0.5        0.825
1 голос
/ 23 марта 2020

Мы можем использовать data.table

library(data.table)
setDT(data)[, meanPrefire := mean(NDVI[date < DATE_FIRE], na.rm = TRUE), .(FID_FIRE)]
...