2016-03-21 12 views
0

Ich habe ein Profil mit drei Eigenschaften zu schaffen, die eine Kombination dieser drei Listen:Sampling mit Einschränkung in R

Char1<-c("a1","a2","a3") 
Char2<-c("b1","b2","b3") 
Char3<-c("c1","c2") 

Ein Profil würde wie etwas aussehen: [ „a1“, „b2“, „ c2 "] oder [" a3 "," b1 "," c1 "]. Ich habe insgesamt 18 Profile. Die Liste der Profile ist L:

L<-unique(do.call(c, apply(expand.grid(Char1,Char2,Char3), 1, combn, m=3, simplify=FALSE))) 

> length(L) 

[1] 18

> sample(L,3,replace=FALSE) # sample of 3 profiles from the list of 18 

[[1]] 
Var1 Var2 Var3 
"a2" "b2" "c1" 

[[2]] 
Var1 Var2 Var3 
"a1" "b1" "c1" 

[[3]] 
Var1 Var2 Var3 
"a3" "b2" "c2" 

I 2 Profile aus dem Pool von 18 Profilen herausnehmen möchten, dass so:

  • Es gibt keine Beschränkung auf das erste Profil, könnte es eines der 18 Profile sein.

  • Für das zweite Profil,

    • wenn Char1 des ersten Profils ist, „A1“, kann Char1 des zweiten only „a2“ und „a3“ sein

    • wenn Char2 des ersten Profils ist "b2", Char2 des zweiten kann nur "b1" oder "b3" sein

    • Wenn Char3 des ersten Profils "c1" ist, kann Char3 des zweiten Profils nur "c2 ".

Ich will das eine 100-mal tun. Wie schreibe ich eine Schleife, die 100 Paare zurückgibt, die diese Einschränkung erfüllen?

Vielen Dank für Ihre Hilfe,

Antwort

0
samples<-lapply(1:100,function(i){ 
profile1<-c(Char1[sample(1:3,1)],Char2[sample(1:3,1)],Char3[sample(1:2,1)]) 
profile2<-c() 
profile2[1]<-ifelse(profile1[1]=="a1",sample(c("a2","a3"),1),Char1[sample(1:3,1)]) 
profile2[2]<-ifelse(profile1[2]=="b2",sample(c("b1","b3"),1),Char2[sample(1:3,1)]) 
profile2[3]<-ifelse(profile1[3]=="c1","c2",Char3[sample(1:2,1)]) 
list(profile1,profile2) 
}) 
+0

Dank für Ihre Hilfe –