1

我最近大部分时间都在 SAS 工作,但不想失去对 RI 的熟悉程度,我想复制一些我做过的基本工作。如果我的 SAS 代码不完美,你会原谅我的,因为我家里没有 SAS,所以我是凭记忆做的。

在 SAS 中,我有一个大致类似于以下示例的数据集(。相当于 SAS 中的 NA)

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)或如何对子组执行操作(如 proc 中的 by cc 命令方法)。另外,我应该注意,我的变量不是按任何顺序命名的,而是根据它们所代表的内容命名的。

我想如果有人可以告诉我如何做上述事情,我可以将其概括为我需要做的事情。

4

2 回答 2

4

另一种方法是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 兄弟通常只给您一个列表。我认为。

于 2009-10-12T16:30:49.683 回答
4

假设您的数据集是一个名为 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)
于 2009-10-12T04:08:14.443 回答