仅获取距参考距离不远的行

时间:2018-09-20 18:44:03

标签: r dataframe dplyr sequential

我想在某种情况下围绕参考线获取行。

例如,到此表:

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(或小于或等于5)的条目。就是说,当前行的起始列与上一个终止列之间的差异,或者当前行的终止列与下一个起始列之间的差异。 该表应按以下方式打印:

| 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,因为{{ 1}}也小于d的5。那是因为所有邻居行都依赖于引用,因此引用cb就像其他行的锚点。

谢谢。

1 个答案:

答案 0 :(得分:1)

这是使用filter中的dplyrrleid中的data.table的方法:

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之内,但由于未与reference f连接而未选择它们。