Ich habe Probleme, die geeignete Funktion zu finden, die eine bestimmte Anzahl von Zeilen zurückgibt, die zufällig ausgewählt wurden, ohne aus einem Datenrahmen in R-Sprache ersetzt zu werden. Kann mir jemand helfen?
333
Machen Sie zuerst einige Daten:
> df = data.frame(matrix(rnorm(20), nrow=10))
> df
X1 X2
1 0.7091409 -1.4061361
2 -1.1334614 -0.1973846
3 2.3343391 -0.4385071
4 -0.9040278 -0.6593677
5 0.4180331 -1.2592415
6 0.7572246 -0.5463655
7 -0.8996483 0.4231117
8 -1.0356774 -0.1640883
9 -0.3983045 0.7157506
10 -0.9060305 2.3234110
Wählen Sie dann einige Zeilen nach dem Zufallsprinzip aus:
> df[sample(nrow(df), 3), ]
X1 X2
9 -0.3983045 0.7157506
2 -1.1334614 -0.1973846
10 -0.9060305 2.3234110
?sample
die R-Konsole eingeben, um Informationen zu dieser Funktion zu erhalten.set.seed(42)
) jedes Mal einzustellen, wenn Sie diese bestimmte Probe reproduzieren möchten.sample.int
wäre etwas schneller, glaube ich:library(microbenchmark);microbenchmark( sample( 10000, 100 ), sample.int( 10000, 100 ), times = 10000 )
Die Antwort, die John Colby gibt, ist die richtige Antwort. Wenn Sie jedoch ein
dplyr
Benutzer sind, gibt es auch die Antwortsample_n
:Stichproben zufällig 10 Zeilen aus dem Datenrahmen. Es ruft auf
sample.int
, ist also wirklich die gleiche Antwort mit weniger Eingabe (und vereinfacht die Verwendung im Kontext von magrittr, da der Datenrahmen das erste Argument ist).quelle
sample_n
nur auftbl of data
Schreiben Sie eine! Das Einwickeln von JCs Antwort gibt mir:
Machen Sie es jetzt besser, indem Sie zuerst prüfen, ob n <= nrow (df) ist, und mit einem Fehler anhalten.
quelle
Das
data.table
Paket bietet die FunktionDT[sample(.N, M)]
, M zufällige Zeilen aus der Datentabelle abzutastenDT
.quelle
Nur der Vollständigkeit halber:
dplyr bietet auch an, einen Anteil oder Bruchteil der Probe durch zu ziehen
Dies ist sehr praktisch, z. B. beim maschinellen Lernen, wenn Sie ein bestimmtes Aufteilungsverhältnis wie 80%: 20% durchführen müssen
quelle
BEARBEITEN : Diese Antwort ist jetzt veraltet, siehe die aktualisierte Version .
In meinem R-Paket habe ich es
sample
so erweitert , dass es sich jetzt auch für Datenrahmen wie erwartet verhält:Dies wird erreicht, indem
sample
eine generische S3-Methode erstellt und die erforderliche (triviale) Funktionalität in einer Funktion bereitgestellt wird. Ein Aufruf,setMethod
alles zu reparieren. Auf die ursprüngliche Implementierung kann weiterhin über zugegriffen werdenbase::sample
.quelle
sample.default(df, ...)
einen Datenrahmen anrufedf
, werden Stichproben aus den Spalten des Datenrahmens abgetastet , da ein Datenrahmen als Liste von Vektoren gleicher Länge implementiert wird.install_github('kimisc', 'krlmlr')
und bekamError: Does not appear to be an R package (no DESCRIPTION)
. Wie kann man das umgehen?[
Operator für Datenrahmen ist ein Gegenbeispiel. Bitte sagen Sie mir auch: Haben Sie jemals, nur ein einziges Mal,sample
Spalten aus einem Datenrahmen abgetastet?iris[2]
funktioniert wie eine Listeiris[[2]]
. Oderiris$Species
,lapply(iris, mean)
... Datenrahmen sind Listen. Ich erwarte also, dass sie sich wie sie verhalten. Und ja, ich habe tatsächlich sample (myDataframe) verwendet. In einem Datensatz, in dem jede Variable Expressionsdaten eines einzelnen Gens enthält. Ihre spezifische Methode hilft Anfängern, ändert aber auch effektiv dassample()
Verhalten. Hinweis Ich verwende "wie erwartet" aus Sicht eines Programmierers. Welches unterscheidet sich von der allgemeinen Intuition. Es gibt eine Menge in R, die nicht mit der allgemeinen Intuition vereinbar ist ...;)In meinem R-Paket gibt es eine Funktion
sample.rows
nur für diesen Zweck:Verbesserung
sample
durch eine generische S3 Funktion war eine schlechte Idee zu machen, nach Kommentaren von Joris Meys auf eine vorherige Antwort .quelle
Wählen Sie eine Zufallsstichprobe aus einem Tibble-Typ in R:
nrow nimmt ein tibble und gibt die Anzahl der Zeilen zurück. Der erste Parameter, an den übergeben wird,
sample
ist ein Bereich von 1 bis zum Ende Ihres Tibbles. Der zweite Parameter, der an die Stichprobe 150 übergeben wird, gibt an, wie viele zufällige Stichproben Sie möchten. Das Schneiden in eckigen Klammern gibt die Zeilen der zurückgegebenen Indizes an. Die Variable 'a' erhält den Wert der Zufallsstichprobe.quelle
Sie könnten dies tun:
Oben habe ich gerade einen Datenrahmen mit 10 Spalten und 100 Zeilen erstellt, ok?
Jetzt können Sie es probieren mit
sample_n
:quelle
Ich bin neu in R, aber ich habe diese einfache Methode verwendet, die für mich funktioniert:
PS: Fühlen Sie sich frei zu bemerken, wenn es einen Nachteil hat, über den ich nicht nachdenke.
quelle
Sie könnten dies tun:
quelle