У меня есть временные ряды суточных значений осадков, начиная с 1838 года и заканчивая 2001 годом. В записи есть несколько пропущенных дней, которые имеют код NA. Мои данные имеют вид:

Year Month Day PPT

1838   1    1   0.0
1838   1    2   NA
1838   1    3   1.3
1838   1    4   0.6

Теперь я использую агрегатную функцию для суммирования дневных сумм осадков в среднемесячные значения за год записи, используя:

aggregate(PPT~Year, df, sum)

Это нормально работает, но проблема в том, что некоторые из ежемесячных совокупных сумм не являются подлинными. Например, если в январе 1838 года было 20 пропущенных дней, то совокупная сумма за этот месяц не была бы подлинной.

Я хочу, чтобы моя агрегатная функция не возвращала агрегированные суммы за любые месяцы, содержащие пропущенные дни (NA), т.е. если отсутствует хотя бы 1 день, я хочу, чтобы месяц не возвращался. В качестве альтернативы я мог бы удалить любые месяцы, содержащие какие-либо значения NA, перед агрегированием.

r
-1
DJ-AFC 12 Май 2016 в 11:54

2 ответа

Лучший ответ
df_precipitation                 <- data.frame(
  Year = rep(x = 2016, times = 61),
  Month = rep(x = c(5, 6), times = c(31, 30)),
  Day = c(1:31, 1:30),
  PPT = c(NA, sample(x = 100, size = 60))
)

df_aggregated                    <- aggregate(
  formula = PPT ~ Year + Month, 
  data = df_precipitation,
  FUN = sum,
  na.action = na.pass
)

df_aggregated                    <- na.omit(object = df_aggregated)

Код создает data.frame с некоторыми фиктивными данными и выполняет агрегирование по году и месяцу с помощью na.action = na.pass.

Если в каком-либо месяце есть значение NA для осадков, na.pass гарантирует, что функция sum () также получит значение NA. И по умолчанию функция sum () возвращает NA, если любое из входных значений - NA.

Затем мы выполняем na.omit, который отбрасывает строки с суммой как NA

Это заставляет агрегатную функцию не возвращать агрегированные суммы за любые месяцы, содержащие пропущенные дни.

1
vasanthcullen 12 Май 2016 в 10:02

Это потенциально может работать с использованием библиотеки dplyr. Я использовал следующие данные: я добавил дополнительную строку с другим месяцем, чтобы правильно показать результаты.

structure(list(year = c(1838, 1838, 1838, 1838, 1838), month = c(1, 1, 1, 1,2), day = c(1, 2, 3, 4, 1), ppt = c(0, NA, 1.3, 0.6, 0.1)), .Names = c("year", "month", "day", "ppt"), row.names = c(NA, -5L), class = "data.frame")

df %>% group_by(year,month) %>% summarise(s = sum(ppt))

Результаты будут следующими, где s - сумма всех значений в течение этого месяца.

  year month     s
 (dbl) (dbl) (dbl)
1  1838     1    NA
2  1838     2   0.1
1
ArunK 12 Май 2016 в 10:06