Использование списка образцов в качестве шаблона для выборки из большого списка без переноса
Если у меня есть вектор букв:
> all <- letters
> all
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
и тогда я определяю эталонный образец из букв следующим образом:
> refSample <- c("j","l","m","s")
в котором расстояние между элементами составляет 2 (с 1 по 2), 1 (со 2 по 3) и 6 (с 3 по 4), как я могу затем выбрать n выборок из all
которые имеют одинаковое, без развертки расстояние между его элементами к refSample
? Например, "a","c","d","j"
а также "q" "s" "t" "z"
будут действительными образцами, но "a","c","d","k"
а также "r" "t" "u" "a"
не будет. Первый имеет разницу в 7 (а не 6) между 3-м и последним элементом, в то время как последний имеет правильный интервал, но оборачивается.
Во-вторых, как я могу параметризовать это так, чтобы все refSample
используется, я могу использовать интервал этого в качестве шаблона?
1 ответ
Решение
Вот простой способ -
all <- letters
refSample <- c("j","l","m","s")
pick_matches <- function(n, ref, full) {
iref <- match(ref,full)
spaces <- diff(iref)
tot_space <- sum(spaces)
max_start <- length(full) - tot_space
starts <- sample(1:max_start, n, replace = TRUE)
return( sapply( starts, function(s) full[ cumsum(c(s, spaces)) ] ) )
}
> set.seed(1)
> pick_matches(5, refSample, all) # each COLUMN is a desired sample vector
[,1] [,2] [,3] [,4] [,5]
[1,] "e" "g" "j" "p" "d"
[2,] "g" "i" "l" "r" "f"
[3,] "h" "j" "m" "s" "g"
[4,] "n" "p" "s" "y" "m"