Как рассчитать среднее значение из указанных c дней в году для нескольких лет в R? - PullRequest
0 голосов
/ 25 марта 2020

Я хотел рассчитать среднюю температуру (t) указанного c периода времени для каждого года.

У меня есть данные о погоде, которые дают значения для каждого дня. Мои реальные данные за 2011-2019 гг. Имеют все дни за все годы, и я хотел бы, например, среднюю температуру за 20 апреля - 15 мая для каждого года.

Пример данных:

df <- data.frame(matrix(ncol = 4, nrow = 8))
x <- c("year", "month","day","t")
colnames(df) <- x
df$year <- c(2011,2011,2011,2011,2012,2012,2012,2012)
df$month <- c(3,3,4,4,3,3,4,4)
df$day <- c(1,2,3,4,1,2,3,4)
df$t <- c(1,3,6,1,2,7,1,-9)

Мне удалось сделать это с очень уродливым и трудоемким кодом, но нехватка знаний остановила меня в моих следах.

Заранее спасибо.

Ответы [ 4 ]

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

С tidyverse вы можете сделать что-то похожее:

library(tidyverse)

Data %>%
  filter((month == 4 & day >= 20) |
         (month == 5 & day <= 15)) %>%
  group_by(year) %>%
  summarise(mean_temp = mean(t))
2 голосов
/ 25 марта 2020

Аналогично ответу @ Бена, но в базе R:

aggregate(t~year, subset(df, (month == 4 & day >= 20) | 
                             (month == 5 & day <= 15)), mean)
0 голосов
/ 25 марта 2020

вы можете добавить довольно сложные вычисления к функции group_by в пакете dplyr. Может быть, вы хотите посмотреть что-то вроде этого.

library(dplyr)
library(lubridate)
df <- data.frame(matrix(ncol = 4, nrow = 8))

x <- c("year", "month","day","t")
colnames(df) <- x
df$year <- c(2011,2011,2011,2011,2012,2012,2012,2012)
df$month <- c(3,3,4,4,3,3,4,4)
df$day <- c(1,2,3,4,1,2,3,4)
df$t <- c(1,3,6,1,2,7,1,-9)
df %>% 
  group_by(lubridate::dmy(paste(day, month, year)) %>% 
             lubridate::yday() %>% 
             between(lubridate::yday(dmy("3.4.2000")), lubridate::yday(dmy("15.5.2000")))) %>% 
  summarise(mean(t)) 

Я использую функцию yday из lubridate, чтобы иметь возможность выбирать дни в течение нескольких лет.

Надеюсь, это поможет !!

0 голосов
/ 25 марта 2020

Попробуйте приведенный ниже код, который я хотел бы использовать для l oop, чтобы справиться с подобными проблемами.

# Create a vector of all years
year_u <- unique(zz$year)

# Create the initial and final period
inicial_day <- 20
inicial_month <- 4

final_day <- 15
final_month <- 5

# Create an empty data.frame to store the data after each loop
averages <- data.frame()

# Open a loop
for(i in 1:length(year)){

    # take each year
    subsets <- subset(zz, year == year_u[i])

    # Mean of each time between the period
    average <- mean(subsets[subsets$day >= inicial_day & subsets$month >= inicial_month &
                                subsets$day <= final_day & subsets$month <= final_month, ]$t)

    # Create a temporary data.frame to store the year and the t_mean
    temp <- data.frame(year = year_u[i], t_mean = average)

    # Combine the actual data with the last
    averages <- rbind(averages, temp)
}
...