2013-02-22 5 views
10

Im Zusammenhang mit this Frage.Stichprobenweise einen Prozentsatz von Zeilen innerhalb eines Datenrahmens

gender <- c("F", "M", "M", "F", "F", "M", "F", "F") 
age <- c(23, 25, 27, 29, 31, 33, 35, 37) 
mydf <- data.frame(gender, age) 

mydf[ sample(which(mydf$gender=='F'), 3), ] 

Anstatt eine Anzahl von Reihen (3 in obigem Fall) Auswählen, wie kann ich wählen zufällig 20% ​​der Zeilen mit „F“? Also von den fünf Zeilen mit "F", wie ich zufällig 20% ​​dieser Zeilen abtastet.

Antwort

11

Wie wäre es damit:

mydf[ sample(which(mydf$gender=='F'), round(0.2*length(which(mydf$gender=='F')))), ] 

Wo 0.2 Ihr 20% und length(which(mydf$gender=='F')) ist die Gesamtzahl der Zeilen mit F

+2

+1, aber nichts dagegen, dass 20% etwas anderes sein kann als eine ganze Zahl, so würde die Verwendung von Runde benötigt. –

+1

guten Punkt, danke, ich habe das hinzugefügt. Übrigens, Sie vermissen ein Komma und schließen eckige Klammer in Ihrer Antwort – Ben

1

20% probieren, können Sie diese verwenden, um die Probengröße zu erhalten:

n = round(0.2 * nrow(mydf[mydf$gender == "F",])) 
+0

Ja, ich war in der Lage, das zu tun, aber das ist eine Datei, die automatisiert ist und jede Stunde ausgeführt wird also kann ich nicht wirklich hineingehen und die Werte anpassen, ohne eine andere Funktion mit einer anderen Anweisung zu schreiben. Dargestellt wäre ein einfacherer Ansatz – ATMathew

+3

Dies ist genau die Antwort auf Ihre Frage, wenn Ihre Frage anders ist, bearbeiten Sie bitte in weiteren Details. –

+0

Möchte jemand den Downvote kommentieren? Diese Antwort beantwortet genau die Frage. –

2

Eigenwerbung. Ich habe eine Funktion geschrieben, die bequemes geschichtetes Sampling ermöglicht, und ich habe eine Option zu Subset-Ebenen aus den Gruppierungsvariablen vor dem Sampling eingefügt.

Die Funktion wird stratified genannt und kann auf folgende Weise verwendet werden:

set.seed(1) 
# Proportional sample 
stratified(mydf, group="gender", size=.2, select=list(gender = "F")) 
# gender age 
# 4  F 29 
# Fixed-size sampling 
stratified(mydf, group="gender", size=2, select=list(gender = "F")) 
# gender age 
# 4  F 29 
# 5  F 31 

Sie mehrere Gruppen angeben können (zum Beispiel, wenn Sie Ihr Datenrahmen ein „Zustand“ Variable enthalten und Sie gruppieren wollten durch " Staat "und" Geschlecht "würden Sie angeben group = c("state", "gender")). Sie können auch mehrere "select" -Argumente angeben (wenn Sie beispielsweise nur weibliche Befragte aus Kalifornien und Texas und Ihre "state" -Variable aus zwei Buchstaben bestehenden Abkürzungen angeben möchten, können Sie select = list(gender = "F", state = c("CA", "TX")) angeben).

Die Funktion selbst kann here oder Sie können das Paket herunterladen und installieren zu finden (die Sie bequem Zugriff auf die Hilfeseiten und Beispiele gibt) durch install_github aus den „devtools“ Paket wie folgt verwendet:

# install.packages("devtools") 
library(devtools) 
install_github("mrdwabmisc", "mrdwab") 
5

Sie können sample_frac() Funktion in dplyr Paket verwenden.

z.B. Wenn Sie innerhalb jeder Gruppe 20% auf Probe:

mydf %>% sample_frac(.2) 

Wenn Sie 20% innerhalb jeder Geschlechtsgruppe probieren möchten:

mydf %>% group_by(gender) %>% sample_frac(.2)