Из вектора целых чисел построить более длинный вектор, включающий все целые числа, расстояние от исходных которых не превышает 10 - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть этот целочисленный вектор:

m <- 10
n <- 1000
index <- sample(seq_len(n), m)

Я хочу расширить index, включив все целые числа, чье расстояние от одного из значений в index не превышает 10, и исключить дубликаты,Дубликаты не очень вероятны, с текущими значениями n и m, но лучше безопасны, чем извините, и в любом случае решение должно работать с общими значениями n и m, с m<n.

Сейчас я делаю следующее:

library(purrr)
index <- unique(sort(unlist(map(index, function(x) seq(x - 10, x + 10)))))

Это работает, но не совсем читабельно.Есть идеи получше?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Лично я бы использовал outer вместо map для этого:

sort(unique(outer(index, -10:10, "+")))

И, как показывает Акрун, вы можете использовать трубопровод, если вы предпочитаете не вкладывать вещи.

0 голосов
/ 13 сентября 2018

Мы можем передать это, чтобы сделать это читаемым

library(tidyverse)
out <- map(index, ~ seq(.x - 10, .x + 10) ) %>% # get the sequence 
         unlist %>%    # unlist the list to a vector
         unique %>%    # get the unique values
         sort          # sort

Вместо цикла мы также можем векторизовать это путем rep лицензирования индекса и затем добавить последовательность чисел из -10:10, получить unique элементов и sort

out2 <- sort(unique(rep(index, each = 21) + (-10:10)))
identical(out, out2)
#[1] TRUE
...