我有一个时间序列的日降水值从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年1月份有20个缺失日,那么该月的总和将不是真实的。
我想要做的是我的汇总功能不会返回包含缺失天数(NA)的任何月份的汇总金额,即如果即使只缺少1天,我也希望不返回月份。或者,我可以在聚合之前删除包含任何NA值的任何月份。
答案 0 :(得分:1)
使用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 :(得分:1)
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值。默认情况下,如果任何输入值为NA
,sum()函数将返回NA然后,我们执行na.omit,它将行总和丢弃为NA
这使得聚合函数不会返回包含缺失天数的任何月份的聚合总和