Wählen Sie ein zufälliges Element in einer Liste von R?

75
a<-c(1,2,0,7,5)

Einige Sprachen haben eine Auswahlfunktion - wählen Sie eine Zufallszahl aus a- wie in R?

hhh
quelle
10
Nebenbei bemerkt: Sie scheinen neu in R zu sein und sollten wahrscheinlich nur einige Einführungsmaterialien lesen. stackoverflow.com/questions/420296/…
Dason

Antworten:

92
# Sample from the vector 'a' 1 element.
sample(a, 1)
Dason
quelle
10
Seien Sie vorsichtig mit der Probe! Wenn adie Länge 1 ist, numerisch ist (im Sinne von is.numeric) und a> = 1 ist, erfolgt die Abtastung über die Stichprobe von 1:a. Beachten Sie, dass diese Komfortfunktion zu unerwünschtem Verhalten führen kann, wenn sie aunterschiedlich lang ist.
Pomber
Gibt es eine Funktion in R, die die Werte abtastet und nicht ausgewählte Werte als NAs belässt?
hhh
30

Die obigen Antworten sind technisch korrekt:

sample(a,1)

Wenn Sie diesen Vorgang jedoch viele Male wiederholen möchten, nehmen wir an, Sie möchten das Werfen eines Würfels nachahmen, müssen Sie Folgendes hinzufügen:

a<-c(1,2,3,4,5,6)
sample(a, 12, replace=TRUE)

Ich hoffe es hilft.

Schimmel
quelle
17

Seien Sie vorsichtig bei der Verwendung der Probe!

sample(a, 1)funktioniert gut für den Vektor in Ihrem Beispiel, aber wenn der Vektor die Länge 1 hat, kann dies zu unerwünschtem Verhalten führen. Er verwendet den Vektor 1:afür die Abtastung.

Wenn Sie also versuchen, ein zufälliges Element aus einem Vektor unterschiedlicher Länge auszuwählen, überprüfen Sie den Fall der Länge 1!

sampleWithoutSurprises <- function(x) {
  if (length(x) <= 1) {
    return(x)
  } else {
    return(sample(x,1))
  }
}
pomber
quelle
Sie sollten diesen Fehler beheben.
Skan
5

Diese Methode erzeugt keinen Fehler, wenn Ihr Vektor die Länge eins hat, und es ist einfach.

a[sample(1:length(a),1)]
Skan
quelle
1

Eine Alternative besteht darin, ein Element mit runif aus dem Vektor auszuwählen. dh

a <- c(1,2,0,7,5)
a[runif(1,1,6)]

Nehmen wir an, Sie möchten eine Funktion, die bei jeder Ausführung eine auswählt (nützlich beispielsweise in einer Simulation). Damit

a <- c(1,2,0,7,5)
sample_fun_a <- function() sample(a, 1)
runif_fun_a <- function() a[runif(1,1,6)]
microbenchmark::microbenchmark(sample_fun_a(), 
                           runif_fun_a(),
                           times = 100000L)

Einheit: Nanosekunden

sample_fun_a () - 4665

runif_fun_a () - 1400

runif scheint in diesem Beispiel schneller zu sein.

MrHopko
quelle