-1

我在 r 中处理了大量文本,并且我已经确定了包含关键文本的行号。我将它们存储为两个不同的对象:location1 和 location2

我现在想创建一个位于 location1 和 location2 之间的行的列表。

location1  int [1:393] 4 21 38 57 75 93 110 127 144 166 ...
location2  int [1:393] 6 23 41 59 77 95 112 129 147 168 ...

所以我正在寻找看起来像这样的输出:

5 22 39 40 58 76 111 128 145 146 167 

这比 location1 + 1 更复杂,因为在某些情况下location1和之间有多条线location2。例如,当location138 和location241 时,我希望在输出中得到 39 和 40。

我该怎么做呢?

谢谢!

4

2 回答 2

1
 unlist(Map(seq, location1 + 1, location2 - 1))
 [1]   5  22  39  40  58  76  94 111 128 145 146 167
于 2021-05-12T20:42:42.147 回答
0

我们可以用Map

unlist(Map(`:`, location1 + 1, location2 - 1))
#[1]   5  22  39  40  58  76  94 111 128 145 146 167

或采用Vectorized 方法rep

v1 <- location2 - location1 -1
rep(location1, v1) + sequence(v1)
#[1]   5  22  39  40  58  76  94 111 128 145 146 167

或使用map2

library(purrr)
map2(location1 + 1, location2 - 1, `:`)

这也可以更改为

tmp <- sweep(df11 , 2,c(1, -1), `+`)

do.call(Map, c(f = `:`, unname(tmp)))

数据

location1 <- c(4, 21, 38, 57, 75, 93, 110, 127, 144, 166)

location2 <- c(6, 23, 41, 59, 77, 95, 112, 129, 147, 168)
df1 <- data.frame(location1, location2)
于 2021-05-12T20:41:09.110 回答