2012-03-04 26 views
6

Aşağıdaki kodu, bana göre oldukça karmaşık bir desen içeren bir matris oluşturmak için aşağıya yazdım. Bu durumda, bitmiş matriste deneme ve hata ile 136 satır olduğunu tespit ettim.R: bilinmeyen satır sayısı olan bir matris oluşturmak

Önceden matris satırlarının sayısını hesaplamak için bir işlev yazabilirim, ancak işlev biraz karmaşık olabilir. Bu örnekte matristeki satır sayısı = ((4 * 3 + 1) + (3 * 3 + 1) + (2 * 3 + 1) + (1 * 3 + 1)) * 4.

Matris ifadesindeki satır sayısını sabitlemeden R'de matris oluşturmanın kolay ve verimli bir yolu var mı? Başka bir deyişle, R döngüleri için gerektiğinde R'nin bir matrise yalnızca bir satır eklemesini sağlamanın kolay bir yolu var mı?

Her geçişte döngüleri kullanarak rbind kullanan bir çözüm sundum, ama biraz sarsılmış gibi görünüyor ve çok daha kolay bir çözüm olup olmadığını merak ediyordum.

Bu soru önceki bir soruyla gereksiz olduğunda özür dilerim. Benzer bir soruyu bu sitedeki arama özelliğini kullanarak veya bugün bir internet arama motoru kullanarak bulamadım, yine de geçmişte benzer bir soruya rastladım. Aşağıda, biri rbind kullanan diğeri de nrow = 136'yı önceden ayarlamak için deneme ve hata kullandığım 2 örnek kod örneği verilmiştir.

Önerileriniz için teşekkür ederiz.

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

Bu 'R Inferno' Daire 2'nin konusudur http://www.burns-stat.com/pages/Tutor/R_inferno.pdf Sürekli rbinding veya cbinding önlemek için haklısınız. –

cevap

6

Eğer tüm verileri

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

tutun ve sonunda onu kesecek kadar büyük bir matris oluşturabilir matrisin boyutu, bazı üst sınır var.

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

Bunu yapmanın genel şeklidir. Bir data.frame için matrix dönüştürmek: Eğer sorunun vektör Bugün bu çözümün tökezledi sıra elemanlarının

+0

rbind'in aynı boyutlara sahip olması için iki bağımsız değişkenine ihtiyacı vardır. –

1

içeren

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

göre uyarlayabilir. for-loop tarafından yeni satırlara ihtiyaç duyulduğunda, satırlar otomatik olarak data.frame'a eklenir. Sonra isterseniz data.frame'u bir matrix'a dönüştürebilirsiniz. Bunun, rbind'un yinelemeli kullanımına benzer bir şey oluşturup oluşturmadığı konusunda emin değilim. Büyük data.frames ile belki çok yavaş olur. Bilmiyorum.

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) 

DÜZENLEME: 27 Temmuz 2015

Ayrıca boş data.frame sonra sonunda matrix için data.frame dönüştürmek oluşturmak, ilk matrix deyimi silebilirsiniz:

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)