2012-07-17 14 views
9

Estoy trabajando en un proyecto en el que necesito ingresar una cantidad de tablas de "puntaje T" en R. Estas son tablas usadas para convertir puntajes de prueba sin procesar en valores estandarizados. Por lo general, siguen un patrón específico, pero no uno que sea simple. Por ejemplo, un patrón es:Producir secuencias numéricas en R usando patrones estándar

34,36,39,42,44,47,50,52,55,58,60,63,66,68, 
71,74,76,79,82,84,87,90,92,95,98,100,103,106 

yo prefiero usar una función simple para llenar estos en, en lugar de escribir a mano. Sé que la función seq() puede crear un seqeuence simple, como:

R> seq(1,10,2) 
[1] 1 3 5 7 9 

¿Hay alguna manera de crear secuencias más complejas basadas en patrones específicos? Por ejemplo, los datos anteriores se pueden hacer como:

c(34,seq(36:106,c(3,3,2)) # The pattern goes 36,39,42,44,47,50,52 (+3,+3,+2) 

... sin embargo, esto produce un error. Pensé que habría una función que debería hacer esto, pero todo mi Google-fu me acaba de traer de vuelta a la secuencia original().

+0

Gracias por todas las grandes respuestas. cumsum() parece que será la mejor opción! – TARehman

Respuesta

10

Esto podría hacerse mediante la función cumsum (suma acumulada) y rep:

> 31 + cumsum(rep(c(3, 2, 3), 9)) 
[1] 34 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 
[20] 84 87 90 92 95 98 100 103 

Para asegurarse de que la secuencia se detiene en el lugar correcto:

> (31 + cumsum(rep(c(3, 2, 3), 10)))[1:28] 
[1] 34 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 
[20] 84 87 90 92 95 98 100 103 106 
9

Aquí es una función personalizada eso debería funcionar en la mayoría de los casos. Utiliza la suma acumulativa (cumsum()) de una secuencia, y la división entera para calcular la longitud de la secuencia deseada.

cseq <- function(from, to, by){ 
    times <- (to-from) %/% sum(by) 
    x <- cumsum(c(from, rep(by, times+1))) 
    x[x<=to] 
} 

Inténtelo:

> cseq(36, 106, c(3,3,2)) 
[1] 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 84 87 90 92 95 98 
[25] 100 103 106 

> cseq(36, 109, c(3,3,2)) 
[1] 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 84 87 90 92 95 98 
[25] 100 103 106 108 
3

Aquí es una solución no iterativo, en caso de que necesite un elemento específico de la secuencia

f <- function(x){ 
d <- (x) %/% 3 
r <- x %% 3 
31 + d*8 + c(0,3,5)[r+1] 
} 

> f(1:10) 
[1] 34 36 39 42 44 47 50 52 55 58 
Cuestiones relacionadas