Использование списка образцов в качестве шаблона для выборки из большого списка без переноса

Если у меня есть вектор букв:

> 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"           
Другие вопросы по тегам