Хобрук: Ваш путь к мастерству в программировании

Получение только строк на расстоянии от ссылки

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

Например, к этой таблице:

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 или меньше (выше или ниже). Это означает разницу между начальным столбцом текущей строки и конечным столбцом предыдущей или разницей между конечным столбцом текущей строки и начальным столбцом следующей. Таблицу следует распечатать так:

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

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


  • Это должно быть что-то вроде out <- t %>% filter(end-start>=5) с использованием dplyr. Однако ваш ожидаемый результат не отражает этого. 20.09.2018
  • что вы подразумеваете под 5 расстоянием? вы пытаетесь фильтровать на основе кратных 5 с начальной строкой? 20.09.2018
  • @ ghub24 это означает разницу между концом предыдущего и началом текущего. 20.09.2018
  • @aichao конечное значение должно быть из предыдущей строки или звездочка из следующей строки 20.09.2018
  • конец первой строки равен 8, начало второй строки равно 10, что делает разницу равной 2, как это привело к желаемому результату, если расстояние равно 5? я не понимаю 20.09.2018
  • @ghub24: я тоже не знаю. @Aureliano: в любом случае попробуйте с lag(end) и посмотрите, получите ли вы то, что хотите. Вы также можете использовать abs для вычисления расстояния. 20.09.2018
  • спасибо за отставание, возможно, это будет полезно, но не решило для всех случаев. Извините, не ровно 5, а равно или меньше 5 20.09.2018
  • d это 6 из c 20.09.2018
  • @avid_useR спасибо. Я починил это. Этот способ работает, но не делайте t$reference == 1 якорем. t %>% filter(lead(start) - end <= 5 | start - lag(end) <= 5) 20.09.2018
  • Мы смотрим до и после reference, а не только после? 20.09.2018
  • t %›% filter(abs(start - lag(end)) ‹=5 | abs(end-lead(start))‹= 5) дал мне желаемый результат 20.09.2018
  • @АндС. Это не удается, если есть строки, отстоящие друг от друга на 5, но не пересекающиеся со ссылкой. 21.09.2018

Ответы:


1

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

20.09.2018
  • есть способ проверить вперед и назад в блоке условия. Я пытаюсь оценить, как уменьшить сложность, потому что этот способ работает нормально, но дважды проверяет все строки и, возможно, может привести к двойному времени выполнения. 24.09.2018
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.