查找最大每日值并返回该值的date_time,R

t98cgbkg  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(149)

我正在处理地下水数据(4个月内间隔2小时),需要找到每日最高和最低地下水位,以及这些值的小时。
下面是我的数据的一个例子
| date_time:dttm|level_m:dbl|日期:日期|hour:int|
| - ------|- ------|- ------|- ------|
| 2019 -06-14 00:00:00|无|2022年6月14日|无|
| 2019 -06-14 02:00:00| -0.004 |2022年6月14日|第二章|
| 三2022年6月14日04时00分| -0.012 |2022年6月14日|四个|
| 4 2022年6月14日06时00分|0.003|2022年6月14日|六个|
| 2019 -06-14 08:00:00|千分之一|2022年6月14日|八个|
| 2019 -06-14 10:00:00|0.878|2022年6月14日|十个|
| 7 2022年6月14日12时00分|0.88|2022年6月14日|十二|
| 8月2022年6月14日14时00分|0.873|2022年6月14日|十四|
| 2019 -06-14 16:00:00|0.872|2022年6月14日|十六|
| 2019 -06-14 18:00:00|零点八七五|2022年6月14日|十八|
| 11日2022年6月14日20时00分|0.876|2022年6月14日|二十个|
| 2019 -06-14 22:00:00|0.887|2022年6月14日|二十二|
我从date_time创建了日期和小时变量,并且一直使用聚合。我使用了max_daily_lvl〈- aggregate(data$level_m ~ data$date,FUN =“max”)
这可以很好地找到最大的每日价值,但不返回我需要的小时。
我继续left_join 'max_daily_lvl' to 'data',但它连接了数据中每个date_time的所有等效的'level_m'值(有很多)。
如果我使用,max_daily_lvl〈- aggregate(data$level_m ~ data$date_time,FUN =“max”),它当然只是返回次每日值,而不是每日值。
谢谢你的忠告

ukdjmx9f

ukdjmx9f1#

使用dplyr v. 1.1.0,你可以尝试以下操作。使用summarize,你可以选择最小值和最大值level_m,并使用which.minwhich.max获得hour。请注意,这将只给予一个小时的结果,即使最小值或最大值在多行中相等。

library(dplyr) #v.1.1.0

summarize(data, min_level = min(level_m), min_hour = hour[which.min(level_m)],
                max_level = max(level_m), max_hour = hour[which.max(level_m)], .by = date)

使用上面的示例数据,输出将是:

date min_level min_hour max_level max_hour
1 2022-06-14    -0.012        4     0.887       22
yhived7q

yhived7q2#

另一个选择是使用我的包timeplyr中的time_summarise(),它可以计算任何时间聚合的摘要。

# remotes::install_github("NicChr/timeplyr") 
library(timeplyr)
library(dplyr)

data <- structure(list(date_time = structure(c(1655164800, 
                                               1655172000, 1655179200, 1655186400, 1655193600, 1655200800, 1655208000, 
                                               1655215200, 1655222400, 1655229600, 1655236800, 1655244000), class = c("POSIXct", 
                                                                                                                      "POSIXt"), 
                                             tzone = "UTC"), 
                       level_m = c(0, -0.004, -0.012, 0.003, 0.001, 0.878, 0.88, 0.873, 0.872, 0.875, 0.876, 0.887), 
                       date = structure(c(19157, 19157, 19157, 19157, 19157, 19157, 19157, 19157, 19157, 19157, 19157, 19157), class = "Date"), 
                       hour = c(0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22)), 
                  row.names = c(NA, -12L), class = c("tbl_df", "tbl", "data.frame"))

data %>%
  time_summarise(min_level = min(level_m), 
                 max_level = max(level_m),
                 min_hour = hour[which.min(level_m)],
                 max_hour = hour[which.max(level_m)],
                 time = date)
#> Assuming a time granularity of 1 day(s)
#> # A tibble: 1 x 5
#>   date       min_level max_level min_hour max_hour
#>   <date>         <dbl>     <dbl>    <dbl>    <dbl>
#> 1 2022-06-14    -0.012     0.887        4       22
data %>%
  time_summarise(min_level = min(level_m), 
                 max_level = max(level_m),
                 min_hour = hour[which.min(level_m)],
                 max_hour = hour[which.max(level_m)],
                 time = date_time, by = "day",
                 floor_date = TRUE)
#> # A tibble: 1 x 5
#>   date_time           min_level max_level min_hour max_hour
#>   <dttm>                  <dbl>     <dbl>    <dbl>    <dbl>
#> 1 2022-06-14 00:00:00    -0.012     0.887        4       22

创建于2023-03-26带有reprex v2.0.2

相关问题