筛选包含odczyt.1字段最大值对应时刻所在日期的所有数据
问题描述
现有如下结构的R数据框(实际数据更复杂):
df1 <- read.table(text = "DT odczyt.1 odczyt.2 '2023-08-14 00:00:00' 362 1.5 '2023-08-14 23:00:00' 633 4.3 '2023-08-15 05:00:00' 224 1.6 '2023-08-15 23:00:00' 445 5.6 '2023-08-16 00:00:00' 182 1.5 '2023-08-16 23:00:00' 493 4.3 '2023-08-17 05:00:00' 434 1.6 '2023-08-17 23:00:00' 485 5.6 '2023-08-18 00:00:00' 686 1.5 '2023-08-18 23:00:00' 487 6.8 '2023-08-19 00:00:00' 566 1.5 '2023-08-19 05:00:00' 278 7.9 '2023-08-19 17:00:00' 561 11.5 '2023-08-19 18:00:00' 365 8.5 '2023-08-19 22:00:00' 170 1.8 '2023-08-19 23:00:00' 456 6.6 '2023-08-20 00:00:00' 498 1.5 '2023-08-20 03:00:00' 961 1.54 '2023-08-20 05:00:00' 397 1.6 '2023-08-20 19:00:00' 532 6.6 '2023-08-20 23:00:00' 493 3.8 '2023-08-21 01:00:00' 441 9.2 '2023-08-21 07:00:00' 793 8.5 '2023-08-21 13:00:00' 395 5.5", header = TRUE) %>% mutate(DT = as.POSIXct(DT))
需求:选出odczyt.1字段数值最大的3个时刻,保留这些时刻所在日期的所有行数据,删除其余行。
根据给定数据,符合条件的3个时刻为:
- 2023-08-20 03:00:00(对应
odczyt.1值961) - 2023-08-21 07:00:00(对应
odczyt.1值793) - 2023-08-18 00:00:00(对应
odczyt.1值686)
预期结果如下:
> result DT odczyt.1 odczyt.2 1 2023-08-18 00:00:00 686 1.50 2 2023-08-18 23:00:00 487 6.80 3 2023-08-20 00:00:00 498 1.50 4 2023-08-20 03:00:00 961 1.54 5 2023-08-20 05:00:00 397 1.60 6 2023-08-20 19:00:00 532 6.60 7 2023-08-20 23:00:00 493 3.80 8 2023-08-21 01:00:00 441 9.20 9 2023-08-21 07:00:00 793 8.50 10 2023-08-21 13:00:00 395 5.50
解决方案
使用dplyr包可高效实现需求,核心逻辑为:提取目标日期、筛选对应行。完整代码如下:
library(dplyr) # 生成数据(若已有数据可跳过此步) df1 <- read.table(text = "DT odczyt.1 odczyt.2 '2023-08-14 00:00:00' 362 1.5 '2023-08-14 23:00:00' 633 4.3 '2023-08-15 05:00:00' 224 1.6 '2023-08-15 23:00:00' 445 5.6 '2023-08-16 00:00:00' 182 1.5 '2023-08-16 23:00:00' 493 4.3 '2023-08-17 05:00:00' 434 1.6 '2023-08-17 23:00:00' 485 5.6 '2023-08-18 00:00:00' 686 1.5 '2023-08-18 23:00:00' 487 6.8 '2023-08-19 00:00:00' 566 1.5 '2023-08-19 05:00:00' 278 7.9 '2023-08-19 17:00:00' 561 11.5 '2023-08-19 18:00:00' 365 8.5 '2023-08-19 22:00:00' 170 1.8 '2023-08-19 23:00:00' 456 6.6 '2023-08-20 00:00:00' 498 1.5 '2023-08-20 03:00:00' 961 1.54 '2023-08-20 05:00:00' 397 1.6 '2023-08-20 19:00:00' 532 6.6 '2023-08-20 23:00:00' 493 3.8 '2023-08-21 01:00:00' 441 9.2 '2023-08-21 07:00:00' 793 8.5 '2023-08-21 13:00:00' 395 5.5", header = TRUE) %>% mutate(DT = as.POSIXct(DT)) # 执行筛选逻辑 result <- df1 %>% # 从时间戳中提取日期 mutate(date = as.Date(DT)) %>% # 选取odczyt.1最大的3行,提取对应的日期集合 slice_max(odczyt.1, n = 3) %>% pull(date) %>% # 筛选原数据中属于目标日期的所有行 {filter(df1, as.Date(DT) %in% .)} # 查看结果 print(result)
关键说明
slice_max(odczyt.1, n = 3):快速选取odczyt.1数值最大的3行;as.Date(DT):将带时间的戳转换为纯日期,确保筛选的是整个日期的所有数据;- 管道符
%>%:简化代码流程,逻辑清晰易维护。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

