删除该月内任何NA值发生的月份中的所有值

时间:2016-05-12 08:54:11

标签: r

我有一个时间序列的日降水值从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值的任何月份。

2 个答案:

答案 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

这使得聚合函数不会返回包含缺失天数的任何月份的聚合总和