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?


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)

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.


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))
  }
}

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)]

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.