R根据data.table从另一列返回的值选择行,或者合并/删除重叠范围

时间:2015-11-18 13:53:59

标签: r data.table

我正在尝试通过存储在同一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()函数。

0 个答案:

没有答案