Агрегирование по фиксированному диапазону дат R - PullRequest
1 голос
/ 20 марта 2020

Учитывая упрощение моего набора данных, например:

df <- data.frame("ID"= c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2),
                  "ForestType" = c("oak","oak","oak","oak","oak","oak","oak","oak","oak","oak","oak","oak",
                                   "pine","pine","pine","pine","pine","pine","pine","pine","pine","pine","pine","pine"),
                  "Date"= c("1987.01.01","1987.06.01","1987.10.01","1987.11.01",
                     "1988.01.01","1988.03.01","1988.04.01","1988.06.01",
                     "1989.03.01","1989.05.01","1989.07.01","1989.08.01",
                     "1987.01.01","1987.06.01","1987.10.01","1987.11.01",
                     "1988.01.01","1988.03.01","1988.04.01","1988.06.01",
                     "1989.03.01","1989.05.01","1989.07.01","1989.08.01"),
                    "NDVI"= c(0.1,0.2,0.3,0.55,0.31,0.26,0.34,0.52,0.41,0.45,0.50,0.7,
                     0.2,0.3,0.4,0.53,0.52,0.54,0.78,0.73,0.72,0.71,0.76,0.9),
                      check.names = FALSE, stringsAsFactors = FALSE) 

Я хотел бы получить средние значения NDVI к определенному периоду времени, в данном случае к году . Примите во внимание, что в моем реальном наборе данных он мне понадобится для сезонов, поэтому он должен быть адаптируемым .

Эти средства должны учитывать:

  • Обрезание выбросов: например, 25% самых высоких значений и 25% самых низких значений.
  • Они должны быть по классу , в данном случае по полю ID.

Таким образом, результат должен выглядеть примерно так:

> desired_df
  ID ForestType Date meanNDVI
1  1        oak 1987    0.250
2  1        oak 1988    0.325
3  1        oak 1989    0.430
4  2       pine 1987    0.350
5  2       pine 1988    0.635
6  2       pine 1989    0.740

В этом случае, например, 0.250 соответствует среднему значению NDVI для 1987 для ID=1, и это среднее от 4 значения того года, взяв самые низкие и самые высокие.

Большое спасибо!

Ответы [ 4 ]

1 голос
/ 20 марта 2020

Еще один вариант. Вы можете установить trim в mean

library(tidyverse)
library(lubridate)
df %>% 
  mutate(Date = ymd(Date) %>% year()) %>% 
  group_by(ID, ForestType, Date) %>% 
  summarise(mean = mean(NDVI, trim = 0.25, na.rm = T))
1 голос
/ 20 марта 2020

Классический базовый подход R с использованием aggregate. Год можно получить с помощью substr.

res <- with(df, aggregate(list(meanNDVI=NDVI), 
                          by=list(ID=ID, ForestType=ForestType, date=substr(Date, 1, 4)),
                          FUN=mean))
res[order(res$ID), ]
#   ID ForestType date meanNDVI
# 1  1        oak 1987   0.2875
# 3  1        oak 1988   0.3575
# 5  1        oak 1989   0.5150
# 2  2       pine 1987   0.3575
# 4  2       pine 1988   0.6425
# 6  2       pine 1989   0.7725

Обрезанная версия

Обрезка для 25% посторонних.

res2 <- with(df, aggregate(list(meanNDVI=NDVI), 
                           by=list(ID=ID, ForestType=ForestType, date=substr(Date, 1, 4)),
                           FUN=mean, trim=.25))
res2[order(res2$ID), ]
#   ID ForestType date meanNDVI
# 1  1        oak 1987    0.250
# 3  1        oak 1988    0.325
# 5  1        oak 1989    0.475
# 2  2       pine 1987    0.350
# 4  2       pine 1988    0.635
# 6  2       pine 1989    0.740
1 голос
/ 20 марта 2020

Используя пакет data.table, вы можете действовать следующим образом:

library(data.table)

setDT(df)[, Date := as.Date(Date, format = "%Y.%m.%d")][]
df[, .(meanNDVI = base::mean(NDVI, trim = 0.25)), by = .(ID, ForestType, year = year(Date))]

#       ID ForestType   year meanNDVI
# 1:     1        oak   1987    0.250
# 2:     1        oak   1988    0.325
# 3:     1        oak   1989    0.475
# 4:     2       pine   1987    0.350
# 5:     2       pine   1988    0.635
# 6:     2       pine   1989    0.740
1 голос
/ 20 марта 2020
library(tidyverse)
library(lubridate)

df %>%
  mutate(Date = as.Date(Date, format = "%Y.%m.%d")) %>%
  group_by(ID, ForestType, Year = year(Date)) %>%
  filter(NDVI > quantile(NDVI, .25) & NDVI < quantile(NDVI, .75)) %>%
  summarise(meanNDVI = mean(NDVI))

Выход

# A tibble: 6 x 4
# Groups:   ID, ForestType [2]
     ID ForestType  Year meanNDVI
  <dbl> <chr>      <dbl>    <dbl>
1     1 oak         1987    0.25 
2     1 oak         1988    0.325
3     1 oak         1989    0.475
4     2 pine        1987    0.35 
5     2 pine        1988    0.635
6     2 pine        1989    0.74 
...