如何在 R 中的数据的列和行之间施加约束?
How to impose contraints between columns and rows in data in R?
以下代码生成包含开始 s
和结束 e
范围的 tibbles 列表。
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)
我想施加一个约束来检查 none 行是否在 tibbles 列表中重叠。如果它确实存在,它应该输出哪些行违反了规则。我只能考虑用复杂的for循环来做这个。
编辑:
该规则只能应用于 lbl
个组。该规则不应适用于整个 tibbles 列表。
使用 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
以下代码生成包含开始 s
和结束 e
范围的 tibbles 列表。
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)
我想施加一个约束来检查 none 行是否在 tibbles 列表中重叠。如果它确实存在,它应该输出哪些行违反了规则。我只能考虑用复杂的for循环来做这个。
编辑:
该规则只能应用于 lbl
个组。该规则不应适用于整个 tibbles 列表。
使用 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