Uso de una lista de muestra como plantilla para tomar muestras de una lista más grande sin envoltura

Si tengo un vector de letras:

> 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"

y luego defino una muestra de referencia de las letras de la siguiente manera:

> refSample <- c("j","l","m","s")

en el que el espacio entre los elementos es 2 (del 1 al 2), 1 (del 2 al 3) y 6 (del 3 al 4), ¿cómo puedo seleccionar n muestras de all que tienen espaciado idéntico, no envolvente entre sus elementos para refSample? Por ejemplo, "a","c","d","j" y "q" "s" "t" "z" serían muestras válidas, pero "a","c","d","k" y "r" "t" "u" "a" no lo haría El primero tiene una diferencia de índice de 7 (en lugar de 6) entre el tercer y último elemento, mientras que el último tiene el espaciado correcto pero se envuelve.

En segundo lugar, ¿cómo puedo parametrizar esto, de modo que sea lo que sea refSample se usa, puedo usar el espaciado de eso como plantilla?

preguntado el 03 de mayo de 12 a las 21:05

1 Respuestas

Aquí hay una manera simple:

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"           

contestado el 03 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.