2016-05-23 6 views
0

Ich habe einen Vektor X der Länge 1000 mit 10 zufällig platzierten und 990 Nullen.Wählen Sie zufälligen Index in Vektor, die Anforderungen erfüllt

I unten Funktion haben, die Vektor X.

foo <- function(X){ 
    old <- sample(which(X==1),1) 
    new <- sample(c(1:1000),1) 
    X[old] <- 0 
    X[new] <- 1 

    return(X) 
} 

Above Funktion hat folgende modifiziert:

  1. Lokalisiert diejenigen
  2. Wählt den Index einer von ihnen zufällig
  3. Selects ein zufälliger Ort in X
  4. Ändert den zuvor gefundenen Wert auf Null
  5. Ändert die zufälligen Ort aus Schritt 3 von 0 auf 1.

Mit obigen Code kann ein 1 zu einer Stelle hinzugefügt werden, die bereits einen 1. hält Dies will ich nicht möglich sein. Mit anderen Worten, ich möchte immer 10 Einsen in meinem Vektor haben.

Die Lösung muss ohne Schleifen sein, weil ich diese Funktion tausende Male anrufe, und Geschwindigkeit ist von wesentlicher Bedeutung.

+0

Was ist 'neue <- Probe (welche (X == 0), 1)'? – lmo

+0

Das wird es tun. Danke – Mongzyy

+0

@lmo Achtung, das funktioniert nur, wenn mehr als eine Zeile übereinstimmt. Schau was passiert mit 'X <-c (1,1,1,1,1,0); Beispiel (was (X == 0), 1) ' – MrFlick

Antwort

0

Der neue Index hat auf Werte beschränkt, wobei X nicht 1:

foo <- function(X){ 
     old <- sample(which(X==1),1) 
     new <- sample(c(1:1000)[X!=1],1) 
     X[old] <- 0 
     X[new] <- 1 

     return(X) 
    } 
Verwandte Themen