2016-06-03 26 views
3

Ich muss einen Datensatz zufällig auswählen, der im Langformat angeordnet ist. In meinem Datensatz hat jedes Subjekt 4 Beobachtungen. Wenn ich also eine Reihe zufällig stichprobe, verliere ich zufällig eine oder mehrere Beobachtungen pro Thema.Zufallsauswahl in R, wenn die Daten im Langformat vorliegen

Dies ist ein simulierten Daten zur Veranschaulichung, sind meine Daten viel größer.

sub sex group dv1 dv2 
P1 m A 0.66 0.94 
P1 m B 0.98 0.26 
P1 m C 0.02 0.03 
P1 m D 0.60 0.30 
P2 m A 0.92 0.99 
P2 m B 0.82 0.09 
P2 m C 0.44 0.67 
P2 m D 0.53 0.80 
P3 f A 0.29 0.22 
P3 f B 0.46 0.20 
P3 f C 0.37 0.77 
P3 f D 0.76 0.54 
P4 m A 0.28 0.99 
P4 m B 0.16 0.57 
P4 m C 0.46 0.75 
P4 m D 0.28 0.21 

In diesem Beispiel muss ich zufällig zwei Männer wählen. Zum Beispiel habe ich versucht mit dplyr verpackt (siehe unten), aber wenn ich eine Probe von 2 geben, gibt es mir nur 2 Zeilen für sex="m" und 2 für sex="f". Insgesamt 4 zufällig ausgewählte Zeilen. Was ich tun muss, ist mir 8 Reihen zu geben, wobei 4 von einem Mann und 4 von einem anderen kommen. Das Ändern des Gruppierungsparameters auf sub funktioniert nicht, da es bellt, dass es nur 2 Ebenen in der Gruppe gibt (eigentlich würde es in diesem Spielzeugbeispiel funktionieren, da es 4 Ebenen für jedes Sub gibt, aber beachte, dass ich 50 Beispiele auswähle aus einem größeren Datensatz). Außerdem würde es mir nur zwei zufällige Zeilen für jedes Sub geben, was ich nicht brauche.

library(dplyr) 
subset <- data %>% 
group_by(sex) %>% 
sample_n(2) 

Bitte schlagen nicht das Datum Wide-Format neu zu gestalten und es dort probieren, da ich weiß, dass ich das tun kann. Ich bin mir sicher, dass es eine Möglichkeit geben muss, im Langformat zu proben.

+1

Haben Sie alle P1 Beobachtungen wählen möchten, wenn P1 gewählt wird, oder nur eine Beobachtung von P1? – lmo

+0

Alle P1-Beobachtungen. Das Problem mit meiner Lösung ist, dass ich nur eine Beobachtung pro Sub zu bekommen, ich möchte alle 4. – mike

Antwort

2

ich von den Patientennamen und dann filtern, indem diese abgetastete Namen probieren würde:

Blick auf alle Männer

male_subset <- data %>% filter(sex == "m") 

nach eindeutigen männlichen ID

male_IDs <- unique(male_subset$sub) 

Probe aus der einzigartigen IDs

sampled_IDs <- sample(male_IDs, 2) 

Jetzt können Sie Ihre Daten auf der Basis dieser Stichprobe IDs Teilmenge:

data %>% filter(sub %in% sampled_IDs) 

Dies sollte alle vier Reihen für jeden der zwei abgetasteten Personen zurück.

+1

Großartig! Das macht was ich will. Vielen Dank @BarkleyBG – mike

0

Ich bin mir nicht sicher, ob ich recht habe verstanden, was Sie wollen. Würde es das tun?

data %>% filter(sex == 'm') %>% filter(sub %in% sample(paste0('P',1:4), 2)) 

Sie müßten ändern, was für Ihre realen Daten in der paste0 Funktion ist, natürlich.

+1

Danke, aber nicht sehen, was ich brauche. Mit diesem Code bekomme ich entweder 4 oder 8 Zeilen. Zumindest die Zeilen sind für jedes Thema (4 von jedem Thema). Was ich brauche, ist nicht Zeilen, sondern Subjekte, wo das Thema Daten in mehr als einer Zeile hat. – mike

0

In Basis R,

set.seed(1) 
subset<- sample(data[data$sex == "m",]$sub,2) 
data_subset<-data[data$sub %in% subset,] 
nrow(data_subset) 
# [1] 8 

Works, aber nicht auffällig.

+0

Ich denke, es gibt eine Möglichkeit, dass Ihre 2 Proben IDs gleich sein könnten.Wenn Sie sich keine eindeutigen IDs ansehen, können Sie die ID derselben Person zweimal probieren und dann nur eine Person (und vier Zeilen) im resultierenden data.frame anstatt zwei Personen mit 8 Zeilen haben. – BarkleyBG

+0

Ich habe gerade diese Lösung ausprobiert. Es funktioniert auch. Ich denke, das Standardverhalten von sample() ist "replace = FALSE", also denke ich, dass es keine Duplikate geben wird. – mike

+0

Von '? Sample()' "sample (x, size, replace = FALSCH, prob = NULL)", also glaube ich nicht, dass es ein Problem geben würde. Allerdings bevorzuge ich @ BarkleyBG's Lösung. Es ist viel mehr R-like. –