2011-03-23 5 views
2

DéfinirComment générer une variable de traitement aléatoire par facteur?

x <- data.frame(
    ID=letters[1:10], 
    class = as.factor(c(rep(1,5),rep(2,5))), 
    treat = rep(0,10)) 

S.T.

> x 
    ID class treat 
1 a  1  0 
2 b  1  0 
3 c  1  0 
4 d  1  0 
5 e  1  0 
6 f  2  0 
7 g  2  0 
8 h  2  0 
9 i  2  0 
10 j  2  0 

J'ai un traitement avec deux niveaux, 1 & 2. Je veux attribuer exactement une une unité par classe pour chaque niveau S.T. que, après la randomisation, nous obtenons quelque chose comme:

> x 
    ID class treat 
1 a  1  0 
2 b  1  0 
3 c  1  1 
4 d  1  0 
5 e  1  2 
6 f  2  0 
7 g  2  0 
8 h  2  0 
9 i  2  2 
10 j  2  1 

s.t. unités c et j obtenir le niveau 1 du traitement et e et i niveau 2.

Comment générer le vecteur de traitement en R?

Répondre

4

Je suppose que vous voulez juste assigner un niveau 1 traitement et un traitement niveau 2 dans chaque classe. Vous pouvez utiliser la fonction ddply du paquet plyr pour le faire facilement:

set.seed(1) 
    require(plyr) 
> ddply(x, .(class), transform, 
     treat = replace(treat, sample(seq_along(treat),2), 1:2)) 

    ID class treat 
1 a  1  0 
2 b  1  1 
3 c  1  0 
4 d  1  0 
5 e  1  2 
6 f  2  0 
7 g  2  0 
8 h  2  1 
9 i  2  2 
10 j  2  0 

Pour expliquer: la fonction ddply divise la trame de données par la variable class, et dans chaque trame de données, il « transforms » la treat en remplaçant 2 entrées choisies au hasard par 1 et 2. La fonction sample(...,2) sélectionne deux index aléatoires dans la colonne treat. D'autres variantes (par exemple attribuer plus de 1 de chaque type de traitement) peuvent être réalisées de manière similaire.

+0

Merci beaucoup! C'est exactement ce que je voulais. Faites de petits changements à la question pour le rendre plus clair selon vos commentaires. – Fred

+0

De rien, content que cela ait aidé. –

Questions connexes