Ostatnio pracowałem głównie w SAS, ale niechcąc stracić znajomość R, chciałbym powtórzyć coś podstawowego, co zrobiłem. Przebaczysz mi, jeśli mój kod SAS nie jest doskonały, robię to z pamięci, ponieważ nie mam w domu SAS.
W SAS mam zestaw danych, który z grubsza jest podobny do następującego przykładu (. Jest równoważny NA w SAS)
A B
1 1
1 3
0 .
0 1
1 0
0 0
Jeśli powyższy zestaw danych był work.foo, mógłbym zrobić coś takiego.
/* 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;
i dostanę coś takiego
A B C
1 1 3
1 3 3
0 . .
0 1 1
1 0 4
0 0 2
Mogę wtedy sortować według C, a następnie wykonywać różne operacje przy użyciu C, aby utworzyć 4 podgrupy. Na przykład mogę zdobyć środki dla każdej grupy
proc means noprint data =work.bar;
by c;
var a b;
output out = work.means mean(a b) = a b;
run;
i otrzymam dane zmiennych według grup o nazwie work.means coś jak:
C A B
1 0 1
2 0 0
3 2 2
4 1 0
Myślę, że mogę też dostać. wierszu, ale nie dbam o to dla moich celów.
Teraz w R. Mam ten sam zestaw danych, który został poprawnie wczytany, ale nie mam pojęcia, jak dodać zmienną do końca (jak CC) lub jak wykonać operację na podgrupie (tak jak polecenie cc w proc znaczy) Należy również zauważyć, że moje zmienne nie są wymienione w żadnej kolejności, ale zgodnie z tym, co reprezentują.
Sądzę, że jeśli ktoś może mi pokazać, jak to zrobić, mogę uogólnić to na to, co muszę zrobić.
Odpowiedzi:
4 dla odpowiedzi № 1Załóżmy, że Twój zbiór danych to dwu-kolumnowym obrazem o nazwie work.foo ze zmiennymi aib. Następujący kod jest jednym ze sposobów robienia tego w 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 dla odpowiedzi nr 2
Alternatywą jest użycie ddply()
z pakietu plyr - nie musiałbyś nawet tworzyć zmiennej grupowej, oczywiście (choć jest to bardzo wygodne).
ddply(work.foo, c("a", "b"), function(x) c(mean(x$a, na.rm = TRUE), mean(x$b, na.rm = TRUE))
Oczywiście, gdybyś miał zmienną grupującą, po prostu byś ją zastąpił c("a", "b")
z "c"
.
Główną zaletą jest to, że plyr
funkcje zwrócą dowolny obiekt, który ci się podoba - ddply pobiera ramkę danych i daje jeden z powrotem, dlugo zwróci listę itp. by()
i jego * dotyczy braci zwykle po prostu daje ci listę. Myślę.