将最接近的相邻索引提取到向量中的索引

时间:2018-09-13 07:28:46

标签: r vectorization

我有一个长度为N的向量,并且在该向量中有一个随机索引ind。 我想以最对称的方式,以最有效的方式将11个最接近的索引提取到ind,例如不要超出原始向量的长度,也不要获取负索引。 / p>

示例:

如果N = 200ind = 199,我想提取190:200。

如果ind = 3,则结果应为1:11。

如果ind = 195,则结果应为190:200。

我可以使用if来做到这一点,但效率似乎很低:

ff = function(ind, N){
  vv = sapply(ind, function(x) c((x-5):(x+5)))
  if (max(vv) > N) {
    vv = vv - max(vv) + N
  } else if (min(vv) < 6) {
    vv = vv - min(vv) + 1
  }
  return(vv)
}

是否有更有效的方法(例如子设置)来做到这一点?

1 个答案:

答案 0 :(得分:2)

以下是几种方法:

1)使用order

sort(head(order(abs(1:N - ind)), 11L))

2)对索引和ind之间的绝对差进行排序,然后获得前11个位置

sort((1:N)[as.integer(names(head(sort(abs(setNames(1:N, 1:N) - ind)), 11L)))])

3)使用基数排序:

sort(head(sort(abs(1:N - ind), index.return=TRUE)$ix, 11L))