2016-03-30 11 views
1

Hier ist mein Code:einen Vektor zu einer Matrix Konvertieren

n <- 10 
set.seed(100) 
d <- rep(NA, n) 
d[1] <- 0 
y <- runif(n) 
a <- 5 

for (i in (2:(length(y)+1))) { 
d[i] <- d[i-1] + y[i-1] 
} 

store.x <- NULL 
for(j in 1:a) { 
x <- runif(1, min = 0, max = sum(y)) 
    for (i in 1:(length(y))) { 
    if(x <= d[i+1] && x > d[i]) { 
    store.x[j] <- i 
    break 
    } 
} 
} 
store.x 

Jetzt store.x druckt 7, 9, 4, 6, 8 Ich möchte diese in eine Matrix können, setzen, wo die Zahlen, die store.x Drucke entsprechen den Spalten und die Reihe ist in der Reihenfolge der Zahlen. Also wäre der erste Eintrag in Zeile 1, Spalte 7, als nächstes wäre Zeile 2, Spalte 9 und so weiter. Ich möchte mit einer n-n-Matrix beginnen, die mit Nullen gefüllt ist, und dann eine Zeile/Spalte hinzufügen, in der sich diese Zahlen befinden. Ich bin mir nicht sicher, wie ich das machen soll. Jede Hilfe wäre willkommen!

+0

'm <- Matrix (0, n, n); m [cbind (seq_along (speichern.x), store.x)] <- store.x'? was genau speicherst du in der neuen matrix? – rawr

Antwort

2

So erstellen Sie eine Matrix mt, die gefüllt wird und dann NA auf Nullen geändert.

n <- 10 
set.seed(100) 
d <- rep(NA, n) 
d[1] <- 0 
y <- runif(n) 
a <- 220 
mt = matrix(nrow = n, ncol = n) 
mt[is.na(mt)] = 0 
for (i in (2:(length(y)+1))) { 
    d[i] <- d[i-1] + y[i-1] 
} 

store.x <- NULL 
for(j in 1:a) { 
    x <- runif(1, min = 0, max = sum(y)) 
    for (i in 1:(length(y))) { 
     if(x <= d[i+1] && x > d[i]) { 
      store.x[j] <- i 

      if(length(which(i == store.x)) > 1){ 
       mt[which(mt[,i] != 0),i] = mt[which(mt[,i] != 0),i] + 1 
      } else { 
       mt[(which(rowSums(mt) == 0)[1]),i] = 1 
      } 

      break 
     } 
    } 
} 

, was ich hinzugefügt wurde diese folgende Logik

if(length(which(i == store.x)) > 1){ 
        mt[which(mt[,i] != 0),i] = mt[which(mt[,i] != 0),i] + 1 
       } else { 
        mt[(which(rowSums(mt) == 0)[1]),i] = 1 
       } 

, wenn die Zahl existiert in store.x erstellt mehr als einmal dann finden wir den bestehenden Eintrag (Spalte i entspricht und Zeile wird derjenige was nicht 0 ist). Wenn die Nummer nicht existiert, finden wir die erste Zeile, die keinen Eintrag hat und diese verwendet.

+0

"Erstellen eines Datenrahmens" Wo erstellt der Code einen data.frame? – Roland

+0

mein Fehler, meinte Matrix. bearbeitet. – zacdav

+0

@zacdav Das ist ein guter Anfang. Aber anstelle von 'mt [j, i] = i' möchte ich, dass es gleich 1 ist, aber auch die Eigenschaft, dass Sie 1 hinzufügen können, wenn ein Duplikat in derselben Zeile/Spalte vorhanden ist. Wenn also in meinem Vektor "store.x" zwei Werte von 7 in meinem vorherigen Beispiel sind, dann hätte Zeile 1 Spalte 7 einen Wert von 1 + 1. – Killian

Verwandte Themen