2012-02-08 3 views
6

Poszukuję skutecznego sposobu na uproszczenie wektora liczb całkowitych jako ciągu podsumowującego, w celu sformatowania go. aby zmieścić się w komórce tabeli.R - Tworzy ciąg znaków, który podsumowuje wektor liczb całkowitych, zastępując wartości sekwencyjne wartością początkową i końcową sekwencji

Na przykład:

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

powinna produkować

"1-4, 6, 8-10"

Staje się to szczególnie przydatne w przypadku, gdy drukowanie wszystkich elementów w wektorze szybko sprawiają, że stół nieczytelny.

np.

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

powinna produkować

"1-50, 53, 89-120"

Odpowiedz

9

Chcesz grupy elementów na bloki kolejnych liczb całkowitych. diff może powiedzieć, czy dwa kolejne elementy znajdują się w tym samym bloku, cumsum może numerować bloki i tapply może wyodrębnić pierwszy i ostatni element każdego bloku.

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

Jest to bardzo czysty sposób robienia tego, co próbowałem napisać od jakiegoś czasu. Dzięki. Dodam, że najpierw sortowanie jest prawdopodobnie polecane 'x <- sort (x)' – digitalmaps

Powiązane problemy