Получение только строк на расстоянии от ссылки - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы получать строки вокруг опорной линии, при условии

1002 * Например, в этой таблице:.
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 |  

Если II нужны только записи на 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, потому что он меньше 5 от расстояния от b, это позволило c получить также d, потому что d также меньше 5 от c.Это потому, что все соседние строки зависят от ссылки, поэтому ссылки b и f подобны привязкам к другим строкам.

Заранее спасибо.

1 Ответ

0 голосов
/ 21 сентября 2018

Вот метод, использующий filter из dplyr и rleid из 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))

Обратите внимание, что хотя h и i находятся на расстоянии 5они не были выбраны, потому что они не соединялись с reference f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...