Utworzyć sekwencję powtarzających się wartości?

83

Potrzebuję sekwencji powtarzających się liczb, czyli 1 1 ... 1 2 2 ... 2 3 3 ... 3 etc.sposób, w jaki to zaimplementowałem:

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

który działa, ale jest niezgrabny i oczywiście nie skaluje się dobrze.

Jak powtórzyć sekwencję N liczb całkowitych M razy każda?

  • Próbowałem gniazdowania seq()i rep()ale nie całkiem to, co chciałem.
  • Oczywiście mogę napisać pętlę for, aby to zrobić, ale powinien istnieć wewnętrzny sposób, aby to zrobić!
Wesley Burr
źródło

Odpowiedzi:

164

Przegapiłeś each=argument dotyczący 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> 

więc twój przykład można zrobić za pomocą prostego pliku

R> rep(1:8, each=20)
Dirk Eddelbuettel
źródło
1

Na przykład odpowiedź Dirka jest doskonała. Jeśli zamiast tego masz ramkę danych i chcesz dodać tego rodzaju sekwencję jako kolumnę, możesz również użyć groupfrom groupdata2 (zastrzeżenie: mój pakiet), aby zachłannie podzielić punkty danych na grupy.

# 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

Istnieje cały szereg metod tworzenia tego rodzaju współczynnika grupowania. Np. Przez liczbę grup, listę rozmiarów grup lub przez to, że grupy zaczynają się, gdy wartość w jakiejś kolumnie różni się od wartości w poprzednim wierszu (np. Jeśli kolumna jest c("x","x","y","z","z")współczynnikiem grupowania będzie c(1,1,2,3,3).

ludvigolsen
źródło
1

Inną base Ropcją może być gl():

gl(5, 3)

Gdzie produkcja jest czynnikiem:

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

Jeśli potrzebne są liczby całkowite, możesz je przekonwertować:

as.numeric(gl(5, 3))

 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
tmfmnk
źródło