仅获取距参考一定距离的行

Getting only rows under a distance from reference

我想在某个条件下围绕参考线获取行。

例如,对此table:

t <- data.frame( 
name       = c("a", "b", "c", "d", "e", "x", "f", "g"), 
reference  = c(  0,   1,   0,   0,   0,   0,   1,   0 ), 
start      = c(  2,  10,  20,  30,  45,  51,  70,  80 ), 
end        = c(  8,  18,  26,  38,  50,  59,  75, 100 ) )

| name | reference | start | end |  
| :--- | :-------- | :---- | :-- |
| a    |    0      | 2     | 8   |  
| b    |    1      | 10    | 18  |  
| c    |    0      | 20    | 26  |  
| d    |    0      | 30    | 38  |  
| e    |    0      | 45    | 50  |  
| x    |    0      | 51    | 59  |  
| f    |    1      | 70    | 75  |  
| g    |    0      | 80    | 100 |  

如果我只想要 5 或更短距离(高于或低于)的条目。这意味着,当前行的开始列与前一行的结束列之间的差异,或者当前行的结束列与下一行的开始列之间的差异。 table 应该打印成这样:

| name | reference | start | end |  
| :--- | :-------- | :---- | :-- |
| a    |    0      | 2     | 8   |  
| b    |    1      | 10    | 18  |  
| c    |    0      | 20    | 26  |  
| d    |    0      | 30    | 38  |  
| f    |    1      | 70    | 75  |  
| g    |    0      | 80    | 100 |  

在这个例子中,我能够得到 c 因为它与 b 的距离小于 5,这允许 c 也检索 d,因为d 也小于 c 的 5。这是因为所有相邻行都依赖于引用,所以引用 bf 就像其他行的锚点。

提前致谢。

这是使用 dplyr 中的 filterdata.table 中的 rleid 的方法:

library(dplyr)

t %>%
  group_by(ID = cumsum(reference)) %>%
  filter(data.table::rleid(abs(start-lag(end, default = start[1])) <= 5) == 1 & ID != 0) %>%
  bind_rows(t %>%
              arrange(desc(row_number())) %>%
              group_by(ID = cumsum(reference)) %>%
              filter(data.table::rleid(abs(end-lag(start, default = end[1])) <= 5) == 1 & ID != 0)) %>%
  ungroup() %>%
  select(-ID) %>%
  distinct() %>%
  arrange(start)

输入:

  name reference start end
1    a         0     2   8
2    b         1    10  18
3    c         0    20  26
4    d         0    30  38
5    e         0    45  50
6    f         1    70  75
7    g         0    80 100
8    h         0   110 115
9    i         0   117 120

输出:

# A tibble: 6 x 4
  name  reference start   end
  <fct>     <dbl> <dbl> <dbl>
1 a             0     2     8
2 b             1    10    18
3 c             0    20    26
4 d             0    30    38
5 f             1    70    75
6 g             0    80   100

数据:

t <- data.frame( name = c("a", "b", "c", "d", "e", "f", "g", "h", "i"),
                 reference = c(0,1,0,0,0,1,0,0,0), 
                 start = c(2, 10, 20, 30, 45, 70, 80, 110, 117), 
                 end = c(8, 18, 26, 38, 50, 75, 100, 115, 120))

注意hi虽然在5之内,但是因为没有和referencef连在一起所以没有被选中。