如何从R data.table中提取同一时间戳下满足条件的数据
在R data.table中筛选满足组级条件的所有行
嘿,这个需求在data.table里处理起来特别顺手,核心思路是按时间戳分组,判断组内是否同时满足X>10和Y<15的条件,满足就保留整个组的所有行。下面给你具体的可复现代码和两种解法:
第一步:构造示例数据
先把你给出的表格转换成可运行的data.table对象:
library(data.table) dt <- data.table( time = rep(c("01-07-2019 13:27:31", "01-07-2019 13:28:20", "01-07-2019 13:49:54", "01-07-2019 13:50:25"), each = 3), var = rep(c("X", "Y", "Z"), 4), val = c(5,10,12,13,12,15,3,3,4,13,11,10) )
解法1:分步筛选(适合新手理解逻辑)
先找出符合条件的时间戳,再提取这些时间戳对应的所有行:
# 1. 先找出所有X值>10的时间戳 x_valid <- dt[var == "X" & val > 10, unique(time)] # 2. 从这些时间戳里再筛选出Y值<15的(确保两个条件同时满足) valid_times <- dt[time %in% x_valid & var == "Y" & val < 15, unique(time)] # 3. 提取所有对应时间戳的行 result <- dt[time %in% valid_times]
解法2:一步到位(data.table风格,高效简洁)
利用data.table的分组特性,直接按time分组后判断组内条件,满足就返回整个组:
result <- dt[, if (.SD[var == "X", val] > 10 & .SD[var == "Y", val] < 15) .SD, by = time]
这里的.SD代表当前分组的所有数据,by = time按时间戳分组后,if语句判断当前组中X的val是否>10且Y的val是否<15,满足就返回整个组的所有行。
预期输出
运行任意一种解法后,都会得到你想要的结果:
time var val 1: 01-07-2019 13:28:20 X 13 2: 01-07-2019 13:28:20 Y 12 3: 01-07-2019 13:28:20 Z 15 4: 01-07-2019 13:50:25 X 13 5: 01-07-2019 13:50:25 Y 11 6: 01-07-2019 13:50:25 Z 10
小提示:如果你的time列是POSIXct类型(标准时间格式),代码完全不需要修改,分组逻辑是通用的。
内容的提问来源于stack exchange,提问作者Victor Johnzon
相关产品推荐
相关产品推荐

