2009-10-12 7 views
1

J'ai travaillé principalement dans SAS dernièrement, mais je ne veux pas perdre la familiarité avec le RI, j'aimerais répliquer quelque chose basique j'ai fait. Vous me pardonnerez si mon code SAS n'est pas parfait, je le fais de mémoire car je n'ai pas SAS à la maison.Travailler avec Data.frames dans R (Utiliser le code SAS pour décrire ce que je veux) r

SAS J'ai un ensemble de données qui est à peu près comme l'exemple suivant (. Est équivalent de NA SAS)

A B 
1 1 
1 3 
0 . 
0 1 
1 0 
0 0 

Si l'ensemble de données ci-dessus a été work.foo alors que je pouvais faire quelque chose comme ce qui suit.

/* create work.bar from dataset work.foo */ 
data work.bar; 
set work.foo; 

/* generate a third variable and add it to work.bar */ 
if a = 0 and b ge 1 then c = 1; 
if a = 0 and b = 0 then c = 2; 
if a = 1 and b ge 1 then c = 3; 
if a = 1 and b = 0 then c = 4; 
run; 

et je reçois quelque chose comme

A B C 
1 1 3 
1 3 3 
0 . . 
0 1 1 
1 0 4 
0 0 2 

Et je pourrais puis trier proc par C, puis effectuer diverses opérations à l'aide de C pour créer 4 sous-groupes. Par exemple, je pourrais obtenir les moyens de chaque groupe avec

proc means noprint data =work.bar; 
by c; 
var a b; 
output out = work.means mean(a b) = a b; 
run; 

et j'obtenir des données de variables par des groupes appelés work.means quelque chose comme:

C A B 
1 0 1 
2 0 0 
3 2 2 
4 1 0 

Je pense que je peux aussi obtenir une . rangée, mais je m'en fous de mes fins. Maintenant dans R. J'ai le même ensemble de données qui a été lu correctement, mais je n'ai aucune idée comment ajouter une variable à la fin (comme CC) ou comment faire une opération sur un sous-groupe (comme le par cc commande dans proc signifie). Aussi, je devrais noter que mes variables ne sont pas nommées dans n'importe quel ordre, mais selon ce qu'elles représentent. Je pense que si quelqu'un peut me montrer comment faire ce qui précède, je peux le généraliser à ce que j'ai besoin de faire.

Répondre

4

Supposons que votre ensemble de données est une structure de données à deux colonnes appelée work.foo avec les variables a et b. Ensuite, le code suivant est une façon de le faire en R:

work.bar <- work.foo 
work.bar$c <- with((a==0 & b>=1) + 2*(a==0 & b==0) + 3*(a==1 & b>=1) + 
       4*(a==1 & b==0), data=work.foo) 
work.mean <- by(work.bar[,1:2], work.bar$c, mean) 
4

Une alternative est d'utiliser ddply() du paquet plyr - vous auriez même pas créer une variable de groupe, nécessairement (bien que cela soit terriblement pratique) .

ddply(work.foo, c("a", "b"), function(x) c(mean(x$a, na.rm = TRUE), mean(x$b, na.rm = TRUE)) 

Bien sûr, si vous aviez la variable de regroupement, vous souhaitez simplement remplacer c("a", "b") avec "c". Le principal avantage dans mon esprit est que plyr fonctions retournera quel que soit le type d'objet que vous aimez - ddply prend une trame de données et vous donne un dos, dlply retournerait une liste, etc. by() et ses * s'appliquent frères habituellement juste vous donner une liste. Je pense.