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

如何利用sel.dt起止列从data.table中提取指定行范围

从data.table中按区间批量提取行的高效方案

看起来你需要根据sel.dt里的起始行号i和结束行号j,批量从data.dt中提取对应区间的行,合并成一个新的data.table对吧?针对这个需求,我给你两个高效的实现方法,都是data.table特有的高效操作,完全避免低效的循环~

方法一:生成行号向量一次性提取

这是最直观且高效的方式,先把所有需要提取的行号整合到一个向量里,再直接用data.table的索引功能提取:

require(data.table)
set.seed(123) # 设置随机种子方便复现
N <- 10000
data.dt <- data.table(id=sample(1:100, N, replace=TRUE), cost=runif(N,100,200))
sel.dt <- data.table(i=sample(5:60,10,replace=TRUE))[, j:=i+sample(1:10,10,replace=TRUE)]

# 生成所有要提取的行号
rows_to_extract <- unlist(mapply(seq, sel.dt$i, sel.dt$j))
# 提取行并生成结果表
result.dt <- data.dt[rows_to_extract]

为什么这个方法高效?

mapply(seq, sel.dt$i, sel.dt$j)会为每个i-j对生成连续的行号序列,unlist把这些小序列合并成一个单一的行号向量,最后用data.dt[rows_to_extract]一次性提取所有行——这是data.table最擅长的操作之一,时间复杂度和提取的总行数成正比,比循环每个区间再rbind快几个数量级,尤其适合你这种N=10000的中等数据量场景。

如果你的区间有重叠,想要去除重复行的话,只需要把行号向量改成unique(rows_to_extract)就行。

方法二:纯data.table链式操作

如果你更习惯data.table的链式语法,可以用下面的写法,全程不用跳出data.table的操作链:

result.dt <- sel.dt[, .(row = seq(i, j)), by = .(idx = 1:nrow(sel.dt))][, data.dt[row]]

思路解释

首先用by = .(idx = 1:nrow(sel.dt))按sel.dt的每一行分组,每组生成对应的行号序列;接着直接用生成的row列去索引data.dt,一步到位得到结果,风格更统一,也同样高效。

你可以运行这两种方法,看看结果是不是你想要的那种包含连续区间行的data.table~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:10