¿Crear secuencia de valores repetidos, en secuencia?


81

Necesito una secuencia de números repetidos, es decir, 1 1 ... 1 2 2 ... 2 3 3 ... 3 etc.la forma en que implementé esto fue:

  nyear <- 20
  names <- c(rep(1,nyear),rep(2,nyear),rep(3,nyear),rep(4,nyear),
             rep(5,nyear),rep(6,nyear),rep(7,nyear),rep(8,nyear))

que funciona, pero es torpe y, obviamente, no escala bien.

¿Cómo repito los N números enteros M veces cada uno en secuencia?

  • Intenté anidar seq()y rep()eso no hizo lo que quería.
  • Obviamente, puedo escribir un bucle for para hacer esto, ¡pero debería haber una forma intrínseca de hacerlo!

Respuestas:


161

Te perdiste el each=argumento de rep():

R> n <- 3
R> rep(1:5, each=n)
 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
R> 

para que su ejemplo se pueda hacer con un simple

R> rep(1:8, each=20)

1

Para su ejemplo, la respuesta de Dirk es perfecta. Si, en cambio, tuviera un marco de datos y quisiera agregar ese tipo de secuencia como columna, también podría usar groupfrom groupdata2 (descargo de responsabilidad: mi paquete) para dividir codiciosamente los puntos de datos en grupos.

# Attach groupdata2
library(groupdata2)
# Create a random data frame
df <- data.frame("x" = rnorm(27))
# Create groups with 5 members each (except last group)
group(df, n = 5, method = "greedy")
         x .groups
     <dbl> <fct>  
 1  0.891  1      
 2 -1.13   1      
 3 -0.500  1      
 4 -1.12   1      
 5 -0.0187 1      
 6  0.420  2      
 7 -0.449  2      
 8  0.365  2      
 9  0.526  2      
10  0.466  2      
# … with 17 more rows

Existe una amplia gama de métodos para crear este tipo de factor de agrupación. Por ejemplo, por número de grupos, una lista de tamaños de grupo, o haciendo que los grupos comiencen cuando el valor en alguna columna difiere del valor en la fila anterior (por ejemplo, si una columna es c("x","x","y","z","z")el factor de agrupación sería c(1,1,2,3,3).


1

Otra base Ropción podría ser gl():

gl(5, 3)

Donde la salida es un factor:

 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
Levels: 1 2 3 4 5

Si se necesitan números enteros, puede convertirlos:

as.numeric(gl(5, 3))

 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.