有没有一种方法可以从每小时数据中找到缺少值的每日最大值

时间:2019-06-16 15:00:35

标签: r dataframe

我已经测量了地面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)

1 个答案:

答案 0 :(得分:0)

在提问时最好提供一个可复制的示例。在这里,我根据您提供的信息创建了一个示例数据框。此数据帧包含从O32010-01-01的每小时2010-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