r - 有没有办法从具有缺失值的每小时数据中找到每日最大值
问题描述
我测量了地面 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)
解决方案
提问时最好提供一个可重复的例子。在这里,我根据您提供的信息创建了一个示例数据框。此数据框包含从到 的每小时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
推荐阅读
- python - Python 脚本作为网页
- javascript - 如何删除mongodb集合中的字段?
- javascript - 使用 echo-laravel 的错误回调并做出反应
- python - Selenium 与 Python:从只读表单中收集电子邮件
- reactjs - 如何将 React.Component 与 renderToString 方法一起使用?
- python - 如何使用 Python 3 创建新的谷歌电子表格并将工作表添加到谷歌驱动器中的特定位置
- knuth - Mastermind 的 Donald Knuth 算法——我们能做得更好吗?
- javascript - 如何使用 JavaScript 中的过滤器根据用户输入过滤整个数组?
- python - 将可选事件传递给具有默认参数的方法
- bash - 单行排除异常模式