我正在尝试通过存储在同一data.table中的两个条件对data.table进行子集化,这些条件由单个键找到。
实际上,我正在尝试合并重叠范围。
我知道怎么做:
dt[, max := max(localRange), by=someGroup]
但是,我想在i
中使用范围作为选择器。如下所示:
dt[range > min(localRange) & range < max(localRange),
max := max(localRange),
by = someGroup]
其中range和finalRange属于同一列,只有range
超出.SD
范围。
或类似的东西:
dt[col2 > dt[,min(col2),by = col1] & col2 < dt[,max(col2),by = col1],
col2 := max(col2)]
其中两个by=
同步/共享相同的col1值
我使用set()
的for循环尝试了它,迭代了最小和最大范围的列表作为data.table的条件。我在data.table表上使用split()
创建的列表:
for (range in split(
dt[,
list(min = min(rightBound),max = max(rightBound)),
by = leftBound
],
f = 1:nrow(dt[,.GRP,by = leftBound])
)
){
set(
x = dt,
i = dt[rightBound >= range$min & rightBound <= range$max]
j = range$max
)
}
这一切都变得一团糟(甚至是错误),尽管我认为这可能是一种(语法上)相当直接的操作。此外,这只是一个步骤,获得与by=
组相关的条件的情况。
如果我想基于by=
中基于.SD
之外的data.table中的数据的一系列转换来调整值,该怎么办?例如:&#34;每次开始,选择结束范围,并根据该范围找到一系列开始&#34;等。
在这里我们谈论范围并不重要,因为我认为这通常是有用的功能。
如果有人想知道实际案例,user971102会为一个简单的案例提供精美的样本数据:
my.df<- data.frame(name=c("a","b","c","d","e","f","g"), leftBound=as.numeric(c(0,70001,70203,70060, 40004, 50000872, 50000872)), rightBound=as.numeric(c(71200,71200,80001,71051, 42004, 50000890, 51000952)))
dt = as.data.table(my.df)
name leftBound rightBound
a 0 71200
b 70001 71200
c 70203 80001
d 70060 71051
e 40004 42004
f 50000872 50000890
g 50000872 51000952
编辑: IRanges包将解决我的实际问题。但是,我仍然很好奇地学习一个更抽象的“链接”案例的可能解决方案。 data.tables中的选择器
非常感谢Jeremycg和AGstudy。虽然它不是findOverlaps()
函数,但reduce()
和disjoin()
函数。