如何在Julia中交叉检查字典并筛选符合条件的事件?
实现Julia字典的事件筛选(时间重叠+近距离)
可以直接对这个字典进行筛选,步骤如下:
1. 转换为DataFrame(更易操作)
首先使用DataFrames包将字典转为表格结构,方便后续的条件判断和筛选:
using DataFrames # 你的原始字典 dt = Dict(:ID => [20, 30, 40, 50] , :Stime => [94, 142, 207, 208], :Etime => [1158, 4420, 1255, 2936], :X => [4603895, 4601068, 4608327, 4606317], :Y => [5809148, 5820498, 5828084, 5825361]) df = DataFrame(dt)
2. 定义条件判断函数
编写函数判断两个事件是否同时满足时间重叠和坐标距离小于1000单位:
- 时间重叠:事件A的开始时间 ≤ 事件B的结束时间,且事件A的结束时间 ≥ 事件B的开始时间
- 坐标距离:为提升计算效率,直接比较距离的平方是否小于
1000²(避免开方运算)
function is_valid_pair(row1::DataFrameRow, row2::DataFrameRow) # 判断时间重叠 time_overlap = row1.Stime <= row2.Etime && row1.Etime >= row2.Stime # 判断坐标距离是否小于1000 dist_sq = (row1.X - row2.X)^2 + (row1.Y - row2.Y)^2 dist_close = dist_sq < 1000^2 return time_overlap && dist_close end
3. 查找符合条件的事件对
遍历所有事件对(避免重复比较,只检查i < j的组合),收集满足条件的事件ID对:
n = nrow(df) valid_pairs = [] for i in 1:n for j in i+1:n if is_valid_pair(df[i, :], df[j, :]) push!(valid_pairs, (df[i, :ID], df[j, :ID])) end end end # 输出结果 if isempty(valid_pairs) println("没有找到满足条件的事件对") else println("满足条件的事件对:") for pair in valid_pairs println(pair) end end
4. 筛选涉及的事件行
如果需要提取所有符合条件的事件数据,可以从DataFrame中筛选出涉及这些事件的行:
# 提取所有符合条件的事件ID valid_ids = unique(vcat(valid_pairs...)) # 筛选DataFrame filtered_events = filter(row -> row.ID in valid_ids, df)
针对你的示例数据的结果
运行上述代码后,会输出没有找到满足条件的事件对——因为所有事件对要么时间重叠但坐标距离远大于1000,要么距离近但时间不重叠。
内容的提问来源于stack exchange,提问作者Chao
相关产品推荐
相关产品推荐

