2012-03-04 61 views
6

Tôi đã viết mã bên dưới để tạo ma trận có chứa những gì, với tôi, một mẫu khá phức tạp. Trong trường hợp này, tôi xác định rằng có 136 hàng trong ma trận đã hoàn thành bằng thử và sai.R: tạo ma trận với số hàng không rõ

Tôi có thể viết một hàm để tính toán số lượng hàng ma trận trước, nhưng hàm sẽ phức tạp một chút. Trong ví dụ này, số hàng trong ma trận = ((4 * 3 + 1) + (3 * 3 + 1) + (2 * 3 + 1) + (1 * 3 + 1)) * 4.

Có cách nào dễ dàng và hiệu quả để tạo ma trận trong R mà không cần phải cố định dây số hàng trong câu lệnh ma trận? Nói cách khác, có cách nào dễ dàng để R đơn giản thêm hàng vào ma trận khi cần thiết khi sử dụng vòng lặp không?

Tôi đã trình bày một giải pháp sử dụng rbind tại mỗi lượt đi qua các vòng, nhưng điều đó có vẻ hơi phức tạp và tôi đã tự hỏi nếu có thể có một giải pháp dễ dàng hơn nhiều.

Xin lỗi nếu câu hỏi này dư thừa với câu hỏi trước đó. Tôi không thể tìm thấy một câu hỏi tương tự bằng cách sử dụng tính năng tìm kiếm trên trang web này hoặc sử dụng công cụ tìm kiếm trên internet ngày nay, mặc dù tôi nghĩ rằng tôi đã tìm thấy một câu hỏi tương tự ở đâu đó trong quá khứ.

Dưới đây là 2 bộ mã ví dụ, một bộ sử dụng rbind và một trong đó tôi đã sử dụng bản dùng thử và lỗi để đặt nrow = 136 trước.

Cảm ơn mọi đề xuất.

v1  <- 5 
v2  <- 2 
v3  <- 2 
v4  <- (v1-1) 

my.matrix <- matrix(0, nrow=136, ncol=(v1+4)) 

i = 1 

for(a in 1:v2) { 
    for(b in 1:v3) { 
    for(c in 1:v4) { 
     for(d in (c+1):v1) { 

     if(d == (c+1)) l.s = 4 
     else   l.s = 3 

     for(e in 1:l.s) { 

      my.matrix[i,c] = 1 

      if(d == (c+1)) my.matrix[i,d] = (e-1) 
      else   my.matrix[i,d] = e 

      my.matrix[i,(v1+1)] = a 
      my.matrix[i,(v1+2)] = b 
      my.matrix[i,(v1+3)] = c 
      my.matrix[i,(v1+4)] = d 

      i <- i + 1 

     } 
     } 
    } 
    } 
} 

my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4)) 
my.matrix3 <- matrix(0, nrow=1, ncol=(v1+4)) 

i = 1 

for(a in 1:v2) { 
    for(b in 1:v3) { 
    for(c in 1:v4) { 
     for(d in (c+1):v1) { 

     if(d == (c+1)) l.s = 4 
     else   l.s = 3 

     for(e in 1:l.s) { 

      my.matrix2[1,c] = 1 

      if(d == (c+1)) my.matrix2[1,d] = (e-1) 
      else   my.matrix2[1,d] = e 

      my.matrix2[1,(v1+1)] = a 
      my.matrix2[1,(v1+2)] = b 
      my.matrix2[1,(v1+3)] = c 
      my.matrix2[1,(v1+4)] = d 

      i <- i+1 

      if(i == 2) my.matrix3 <- my.matrix2 
      else  my.matrix3 <- rbind(my.matrix3, my.matrix2) 

      my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4)) 

     } 
     } 
    } 
    } 
} 

all.equal(my.matrix, my.matrix3) 
+3

này là chủ đề của Vòng 2 của 'The R Inferno' http://www.burns-stat.com/pages/Tutor/R_inferno.pdf Bạn có quyền tránh bị ràng buộc hoặc ràng buộc liên tục. –

Trả lời

6

Nếu bạn có một số giới hạn trên kích thước của ma trận, bạn có thể tạo ra một ma trận đủ lớn để giữ tất cả các dữ liệu

my.matrix <- matrix(0, nrow=v1*v2*v3*v4*4, ncol=(v1+4)) 

và cắt nó ở cuối.

my.matrix <- my.matrix[1:(i-1),] 
2

Đây là biểu mẫu chung để thực hiện. Bạn có thể thích ứng với nó để vấn đề của bạn

matrix <- NULL 
for(...){ 
... 
matrix <- rbind(matriz,vector) 
} 

nơi vector chứa các yếu tố hàng

+0

rbind cần hai đối số của nó để có cùng kích thước –

1

tôi stumbled khi giải pháp này ngày hôm nay: chuyển đổi các matrix đến một data.frame. Vì các hàng mới là cần thiết bởi for-loop các hàng đó được tự động thêm vào data.frame. Sau đó, bạn có thể chuyển đổi data.frame trở lại thành matrix ở cuối nếu bạn muốn. Tôi không chắc liệu điều này có cấu thành điều gì đó tương tự như việc sử dụng lặp lại của rbind hay không. Có lẽ nó trở nên rất chậm với data.frames lớn. Tôi không biết.

my.data <- matrix(0, ncol = 3, nrow = 2) 
my.data <- as.data.frame(my.data) 

j <- 1 

for(i1 in 0:2) { 
    for(i2 in 0:2) { 
      for(i3 in 0:2) { 

        my.data[j,1] <- i1 
        my.data[j,2] <- i2 
        my.data[j,3] <- i3 

        j <- j + 1 

      } 
    } 
} 

my.data 
my.data <- as.matrix(my.data) 
dim(my.data) 
class(my.data) 

EDIT: 27 Tháng 7 năm 2015

Bạn cũng có thể xóa các tuyên bố đầu tiên matrix, tạo ra một sản phẩm nào data.frame sau đó chuyển đổi data.frame đến một matrix ở cuối:

my.data <- data.frame(NULL,NULL,NULL) 

j <- 1 

for(i1 in 0:2) { 
    for(i2 in 0:2) { 
      for(i3 in 0:2) { 

        my.data[j,1] <- i1 
        my.data[j,2] <- i2 
        my.data[j,3] <- i3 

        j <- j + 1 
      } 
    } 
} 

my.data 
my.data <- as.matrix(my.data) 
dim(my.data) 
class(my.data) 
Các vấn đề liên quan