Tạo chuỗi các giá trị lặp lại, theo thứ tự?


81

Tôi cần một chuỗi các số lặp lại, tức là 1 1 ... 1 2 2 ... 2 3 3 ... 3 etc.Cách tôi thực hiện điều này là:

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

hoạt động, nhưng vụng về và rõ ràng là không mở rộng quy mô tốt.

Làm thế nào để lặp lại N số nguyên M lần mỗi lần trong trình tự?

  • Tôi cố gắng làm tổ seq()rep()nhưng điều đó không hoàn toàn làm những gì tôi muốn.
  • Tôi rõ ràng có thể viết vòng lặp for để làm điều này, nhưng cần phải có một cách nội tại để làm điều này!

Câu trả lời:


161

Bạn đã bỏ lỡ each=đối số để 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> 

vì vậy, ví dụ của bạn có thể được thực hiện với một

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

1

Đối với ví dụ của bạn, câu trả lời của Dirk là hoàn hảo. Thay vào đó, nếu bạn có một khung dữ liệu và muốn thêm loại chuỗi đó làm cột, bạn cũng có thể sử dụng grouptừ groupdata2 (từ chối trách nhiệm: gói của tôi) để chia các điểm dữ liệu thành các nhóm một cách tham lam.

# 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

Có rất nhiều phương pháp để tạo ra loại yếu tố nhóm này. Ví dụ: theo số lượng nhóm, danh sách kích thước nhóm hoặc bằng cách để các nhóm bắt đầu khi giá trị trong một số cột khác với giá trị trong hàng trước đó (ví dụ: nếu một cột là c("x","x","y","z","z")yếu tố nhóm sẽ được c(1,1,2,3,3).


1

Một base Rtùy chọn khác có thể là gl():

gl(5, 3)

Trong đó đầu ra là một yếu tố:

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

Nếu cần số nguyên, bạn có thể chuyển đổi nó:

as.numeric(gl(5, 3))

 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.