/ / Praca z Data.frames w R (używając kodu SAS do opisania czego chcę) r - r, sas, dataframe

Praca z Data.frames w R (przy użyciu kodu SAS, aby opisać, co chcę) r - r, sas, ramka danych

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 № 1

Załóż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ę.