2012-02-08 8 views
6

Estoy buscando una forma eficiente de simplificar un vector de enteros como una cadena de resumen, para formatearlo para caber en una celda de la mesa.R - Produce una cadena que resume un vector de enteros reemplazando valores secuenciales con el valor inicial y final de la secuencia

Por ejemplo:

c(1, 2, 3, 4, 6, 8, 9, 10)

debería producir

"1-4, 6, 8-10"

Esto se hace especialmente útil en los casos en que la impresión de todos los elementos en el vector sería hacer rápidamente la tabla ilegible.

p. Ej.

c(1:50, 53, 89:120)

debería producir

"1-50, 53, 89-120"

Respuesta

9

Desea agrupar los elementos en bloques de números enteros consecutivos. diff puede decirle si dos elementos consecutivos están en el mismo bloque, cumsum puede numerar los bloques y tapply puede extraer el primer y último elemento de cada bloque.

x <- c(1:50, 53, 89:120) 
y <- tapply(x, c(0,cumsum(diff(x) != 1)), range) 
# Format the result 
y <- sapply(y, function(u) 
    if(u[1]==u[2]) u[1] 
    else paste(u,collapse=":") 
) 
paste(y, collapse=", ") 
+0

Esta es una manera muy limpia de hacer esto que he estado tratando de escribir durante un tiempo. Gracias. Yo agregaría que la clasificación primero es probablemente aconsejable 'x <- sort (x)' – digitalmaps

Cuestiones relacionadas