Работа с Data.frames в R (Использование кода SAS для описания того, что я хочу) - PullRequest
1 голос
/ 12 октября 2009

В последнее время я в основном работаю в SAS, но не желая терять то, что имею с R, я хотел бы повторить кое-что базовое, что я сделал. Вы простите меня, если мой код SAS не совершенен, я делаю это по памяти, поскольку у меня дома нет SAS.

В SAS у меня есть набор данных, который примерно такой же, как в следующем примере (. Эквивалентен NA в SAS)

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

Если набор данных выше был work.foo, то я мог бы сделать что-то вроде следующего.

/* 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;

и я бы получил что-то вроде

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

И тогда я мог бы выполнить сортировку по C, а затем выполнить различные операции, используя C, чтобы создать 4 подгруппы. Например, я мог бы получить средства каждой группы с

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

и я получу данные о переменных по группам, называемым work.means что-то вроде:

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

Думаю, я тоже могу получить. грести, но меня это не волнует.

Теперь в R. У меня есть тот же набор данных, который был прочитан правильно, но я понятия не имею, как добавить переменную в конец (например, CC) или как выполнить операцию в подгруппе (например, by ​​cc команда в proc означает). Кроме того, я должен отметить, что мои переменные именуются не в каком-либо порядке, а в соответствии с тем, что они представляют.

Я полагаю, если кто-то может показать мне, как сделать выше, я могу обобщить это к тому, что мне нужно сделать.

Ответы [ 2 ]

4 голосов
/ 12 октября 2009

Альтернативой является использование ddply() из пакета plyr - вам даже не придется создавать групповую переменную, обязательно (хотя это очень удобно).

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

Конечно, если бы у вас была переменная группировки, вы бы просто заменили c("a", "b") на "c".

Основное преимущество, на мой взгляд, состоит в том, что plyr функции будут возвращать любые объекты, которые вам нравятся - ddply берет фрейм данных и возвращает его обратно, dlply возвращает список и т. Д. by() и его * apply братья обычно просто дают вам список. Я думаю.

4 голосов
/ 12 октября 2009

Предположим, ваш набор данных представляет собой двухколонный фрейм данных с именем work.foo с переменными a и b. Тогда следующий код является одним из способов сделать это в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...