首页 > 解决方案 > 有没有办法从具有缺失值的每小时数据中找到每日最大值

问题描述

我测量了地面 O3 的每小时数据,但缺少一些数据(标记为 NA)。我想计算每日最大值,但前提是每个日期有超过 17 小时的测量值。如果每个日期少于 18 次测量,我想写 NA。

head(o3sat)
    date        hour    O3
      1/1/2010      0       50.2     
      1/1/2010      1       39.8     
      1/1/2010      2       41.8     
      1/1/2010      3       NA     
      1/1/2010      4       9.2    
      1/1/2010      5       6.0    

是否有可能在此函数中添加一些参数以指示一天内必须至少有 75% 的数据可用才能计算值,否则将删除数据

maximums <- aggregate(o3sat["dnevnik"], list(Date = as.Date(o3sat$datum)),  max, na.rm = TRUE)

标签: rdataframe

解决方案


提问时最好提供一个可重复的例子。在这里,我根据您提供的信息创建了一个示例数据框。此数据框包含从到 的每小时O3测量值。2010-01-012010-01-03

library(dplyr)
library(tidyr)
library(lubridate)

o3sat <- read.table(text = "    date        hour    O3
      '1/1/2010'      0       50.2     
      '1/1/2010'      1       39.8     
      '1/1/2010'      2       41.8     
      '1/1/2010'      3       NA     
      '1/1/2010'      4       9.2    
      '1/1/2010'      5       6.0  ",
                    stringsAsFactors = FALSE, header = TRUE)

set.seed(1234)

o3sat_ex <- o3sat %>%
  mutate(date = mdy(date)) %>%
  complete(date = seq.Date(ymd("2010-01-01"), ymd("2010-01-03"), 1), hour = 0:23) %>%
  mutate(O3 = c(o3sat$O3, rnorm(66, 30, 10))) %>%
  mutate(O3 = ifelse(row_number() %in% sample(7:72, 18), NA, O3))

我们可以使用以下代码计算每天有多少非 NA 值。

o3sat_ex %>%
  group_by(date) %>%
  summarize(sum(!is.na(O3)))
# # A tibble: 3 x 2
#   date       `sum(!is.na(O3))`
#   <date>                 <int>
# 1 2010-01-01                18
# 2 2010-01-02                17
# 3 2010-01-03                18 

根据您的描述,我们想计算 和 的最大值2010-01-012010-01-03但不是2010-01-02因为它只包含 17 个非 NA 值。

这是实现任务的一种方法,我们可以定义一个函数 ,max_helper它仅在非 NA 值的计数大于 17 时返回最大值。

max_helper <- function(x, threshold){
  if (sum(!is.na(x)) >= threshold) {
    r <- max(x, na.rm = TRUE)
  } else { 
    r <- NA
  }
  return(r)
} 

我们可以使用代码应用这个数字dplyr来获得答案。

o3sat_ex2 <- o3sat_ex %>%
  group_by(date) %>%
  summarize(O3 = max_helper(O3, 18))

o3sat_ex2
# # A tibble: 3 x 2
#   date          O3
#   <date>     <dbl>
# 1 2010-01-01  50.2
# 2 2010-01-02  NA  
# 3 2010-01-03  47.8

推荐阅读