Как наложить ограничения между столбцами и строками в данных в R? - PullRequest
0 голосов
/ 24 апреля 2018

Следующий код генерирует список элементов, содержащих начальные, s и конечные e диапазоны.

library(tidyverse)
tbl1 <- tibble(
  s = c(1, 4, 7, 10),
  e = c(3, 6, 8, 12),
  lbl = c("a", "a", "a", "a")
)

tbl2 <- tibble(
  s = c(1, 2, 5, 8),
  e = c(3, 4, 6, 10),
  lbl = c("b", "b", "b", "b")
)

tbls <- list(tbl1, tbl2)

Я хочу наложить ограничение, которое проверяет, не перекрывается ли ни одна из строк в списке элементов. Если он существует, он должен вывести, какие строки нарушают правило. Я могу думать только о том, чтобы делать это со сложными циклами for.

EDIT:

Правило должно применяться только в группах lbl. Правило не должно распространяться на весь список элементов.

1 Ответ

0 голосов
/ 24 апреля 2018

Опцией использования lead и lag может быть:

bind_rows(tbls, ) %>% group_by(lbl) %>%
  arrange(lbl, s) %>%
  filter(s <= lag(e, default = 0) | e >= lead(s, default = +Inf) )

# # A tibble: 2 x 3
# # Groups: lbl [1]
#      s     e lbl  
#   <dbl> <dbl> <chr>
# 1  1.00  3.00 b    
# 2  2.00  4.00 b 
...