Извлечение ближайших соседних индексов в индекс в векторе - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть вектор длины N и случайный индекс ind в этом векторе.Я хотел бы извлечь 11 ближайших индексов самым симметричным из возможных способов до ind наиболее эффективным способом, например, чтобы не превышать длину исходного вектора, а также не получить отрицательные индексы.

Примеры:

, если N = 200, и ind = 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 голосов
/ 13 сентября 2018

Вот несколько подходов:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...