我已经测量了地面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)
答案 0 :(得分:0)
在提问时最好提供一个可复制的示例。在这里,我根据您提供的信息创建了一个示例数据框。此数据帧包含从O3
到2010-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-01
和2010-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