You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

筛选包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:14:56