仅获取距参考一定距离的行
Getting only rows under a distance from reference
我想在某个条件下围绕参考线获取行。
例如,对此table:
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 或更短距离(高于或低于)的条目。这意味着,当前行的开始列与前一行的结束列之间的差异,或者当前行的结束列与下一行的开始列之间的差异。
table 应该打印成这样:
| 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
也小于 c
的 5。这是因为所有相邻行都依赖于引用,所以引用 b
和 f
就像其他行的锚点。
提前致谢。
这是使用 dplyr
中的 filter
和 data.table
中的 rleid
的方法:
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
连在一起所以没有被选中。
我想在某个条件下围绕参考线获取行。
例如,对此table:
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 或更短距离(高于或低于)的条目。这意味着,当前行的开始列与前一行的结束列之间的差异,或者当前行的结束列与下一行的开始列之间的差异。 table 应该打印成这样:
| 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
也小于 c
的 5。这是因为所有相邻行都依赖于引用,所以引用 b
和 f
就像其他行的锚点。
提前致谢。
这是使用 dplyr
中的 filter
和 data.table
中的 rleid
的方法:
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
连在一起所以没有被选中。