我想在某种情况下围绕参考线获取行。
例如,到此表:
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(或小于或等于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
,因为{{ 1}}也小于d
的5。那是因为所有邻居行都依赖于引用,因此引用c
和b
就像其他行的锚点。
谢谢。
答案 0 :(得分: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
连接而未选择它们。