2015-11-21 9 views
5

W poniższej przykładowej ramce danych chciałbym narysować warstwową próbkę losową (np. 40%) "ID" identyfikatora z każdego poziomu czynnika "Cohort" :R: Uwarunkowana losowa proporcja próbna unikalnych identyfikatorów według zmiennej grupującej

data<-structure(list(Cohort = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), ID = structure(1:20, .Label = c("a1 ", 
"a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "b10", "b11", 
"b12", "b13", "b14", "b15", "b16", "b17", "b18", "b19", "b20" 
), class = "factor")), .Names = c("Cohort", "ID"), class = "data.frame", row.names = c(NA, 
-20L)) 

wiem tylko jak wyciągnąć losową liczbę wierszy przy użyciu następujących:

library(dplyr) 
data %>% 
group_by(Cohort) %>% 
sample_n(size = 10) 

Ale moje rzeczywiste dane są podłużne, więc mam kilka przypadków tego samego identyfikatora wewnątrz każdej grupie i kilka kohorty o różnych rozmiarach, a więc konieczność wyboru proporcji unikalnych identyfikatorów. Każda pomoc będzie doceniona.

+0

Należy dostarczyć dane, które odtworzenia masz problem, inaczej nie możemy tego zrozumieć ... więc jeśli masz wiele identyfikatorów, proszę produkuj dane za pomocą tej funkcji;) – Arthur

Odpowiedz

7

Oto jeden ze sposobów:

data %>% group_by(Cohort) %>% 
    filter(ID %in% sample(unique(ID), ceiling(0.4*length(unique(ID))))) 

ta zwróci wszystkie wiersze zawierające losowo identyfikatory. Innymi słowy, zakładam, że masz pomiary, które pasują do każdego wiersza i że chcesz wszystkie pomiary dla każdego próbkowanego ID. (Jeśli chcesz tylko jeden rząd powrócił do każdej pobranej ID następnie @ odpowiedź bramtayl będzie to zrobić.)

Na przykład:

data = data.frame(rbind(data, data), value=rnorm(2*nrow(data))) 

data %>% group_by(Cohort) %>% 
    filter(ID %in% sample(unique(ID), ceiling(0.4*length(unique(ID))))) 

    Cohort  ID  value 
    (int) (fctr)  (dbl) 
1  1 a1 -0.92370760 
2  1  a2 -0.37230655 
3  1  a3 -1.27037502 
4  1  a7 -0.34545295 
5  2 b14 -2.08205561 
6  2 b17 0.31393998 
7  2 b18 -0.02250819 
8  2 b19 0.53065857 
9  2 b20 0.03924414 
10  1 a1 -0.08275011 
11  1  a2 -0.10036822 
12  1  a3 1.42397042 
13  1  a7 -0.35203237 
14  2 b14 0.30422865 
15  2 b17 -1.82008014 
16  2 b18 1.67548568 
17  2 b19 0.74324596 
18  2 b20 0.27725794 
4

Dlaczego nie

library(dplyr) 

data %>% 
    select(ID, Cohort) %>% 
    distinct %>% 
    group_by(Cohort) %>% 
    sample_frac(0.4) %>% 
    left_join(data)