R:

2015-11-21 25 views
5

değişkenini gruplandırarak benzersiz ID'lerin katmanlanmış rasgele örnek oranı Aşağıdaki örnek veri çerçevesiyle, "Kohort" faktörünün her seviyesinden ID'nin "Kimliğinin" tabakalı rastgele bir örneğini (örn.,% 40) çizmek istiyorum : sadece kullanarak satır rastgele bir sayı çizmek bilmekR:

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)) 

aşağıdadır:

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

Ama benim gerçek veri boyuna yüzden ben her kohort ve birkaç içinde aynı kimliğinin çoklu vaka var Farklı boyutlarda kohortlar, böylece benzersiz ID'lerin bir oranını seçme ihtiyacı. Herhangi bir yardım takdir edilecektir.

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

Bu rastgele örneklenmiş kimliklerini içeren tüm satırları döndürür:

+0

çoğaltamaz Neden Probleminiz var, aksi halde bunu anlayamıyoruz ... böylece birden fazla kimliğiniz varsa, lütfen bu özellik ile veri üretin;) – Arthur

cevap

7

İşte bir yoludur. Diğer bir deyişle, her bir satırda yapılan ölçümleri aldığınızı ve her bir örneklenmiş kimlik için tüm ölçümleri istediğinizi varsayıyorum. (Sadece istiyorsanız bir satır yapacak bramtayl cevabı @ sonra her örneklenmiş kimliği için döndü.) Örneğin

:

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

library(dplyr) 

data %>% 
    select(ID, Cohort) %>% 
    distinct %>% 
    group_by(Cohort) %>% 
    sample_frac(0.4) %>% 
    left_join(data) 
Veriyi sağlamalıdır