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

如何在数据集Jon中按test文件区间查找lgmeandiff最大值?

解决大数据集区间筛选并提取最大值记录问题

问题说明

针对test数据集中的每个from-to区间,在Jon数据集中筛选TTS值处于该区间的行,找出其中lgmeandiff值最大的记录,最终将所有结果汇总输出到文件。

原有代码的问题

  • 逻辑错误:错误地判断lgmeandiff是否在区间内,实际应筛选TTS落在区间的行
  • 效率极低:嵌套循环遍历所有行,大数据场景下性能极差
  • 数据拼接混乱:将区间序列与数据框绑定,导致输出结构错误
  • 冗余操作:循环内重复生成区间序列,无实际意义

解决方案

方法1:dplyr实现(简洁易读)

借助dplyr的语法简化逻辑,适合中小数据集:

library(dplyr)
library(purrr)

# 遍历test的每个区间,提取对应最大值记录
result <- map_dfr(1:nrow(test), function(i) {
  from_val <- test$from[i]
  to_val <- test$to[i]
  
  Jon %>%
    filter(TTS >= from_val & TTS <= to_val) %>%
    slice_max(lgmeandiff, n = 1) # 若有多个最大值,会保留所有匹配行
})

# 写入输出文件
write.csv(result, "output.csv", row.names = FALSE)

方法2:data.table实现(大数据最优)

data.table在处理百万级以上数据时性能远超其他方法:

library(data.table)

# 转换为data.table格式
setDT(Jon)
setDT(test)

# 按区间分组处理,提取最大值记录
result <- test[, {
  Jon[TTS >= from & TTS <= to][which.max(lgmeandiff)]
}, by = .(from, to)]

# 高效写入文件
fwrite(result, "output.csv")

方法3:基础R实现(无需额外包)

如果不想加载第三方包,可使用基础R函数实现:

# 遍历test每行,处理区间筛选
result <- do.call(rbind, apply(test, 1, function(row) {
  from_val <- as.numeric(row["from"])
  to_val <- as.numeric(row["to"])
  
  # 筛选TTS在区间内的行
  match_rows <- Jon$TTS >= from_val & Jon$TTS <= to_val
  if (any(match_rows)) {
    # 找到lgmeandiff最大的行
    max_pos <- which.max(Jon$lgmeandiff[match_rows])
    Jon[match_rows, ][max_pos, ]
  } else {
    # 处理无匹配的情况,返回空行
    data.frame(matrix(NA, nrow = 1, ncol = ncol(Jon), dimnames = list(NULL, colnames(Jon))))
  }
}))

# 写入文件
write.csv(result, "output.csv", row.names = FALSE)

样本验证

用你提供的测试数据验证:
test第3行区间358-366,Jon中符合条件的行TTS为358、360、361、363,对应的lgmeandiff最大值是-0.0954,对应TTS=358的行,会被正确提取。

内容的提问来源于stack exchange,提问作者merinakzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:23:17