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.