【问题标题】:Working with Data.frames in R (Using SAS code to describe what I want)r在 R 中使用 Data.frames(使用 SAS 代码来描述我想要的)r
【发布时间】:2010-12-05 20:44:02
【问题描述】:

我最近大部分时间都在 SAS 工作,但不想失去对 R 的熟悉程度,我想复制一些我做过的基本工作。如果我的 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)或如何对子组进行操作(如 by cc proc 中的命令意味着)。另外,我应该注意,我的变量不是按任何顺序命名的,而是根据它们所代表的含义。

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

【问题讨论】:

    标签: r sas dataframe


    【解决方案1】:

    假设您的数据集是一个名为 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)
    

    【讨论】:

      【解决方案2】:

      另一种方法是使用 plyr 包中的 ddply() - 您甚至不必创建组变量,当然(尽管这非常方便)。

      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弟兄们通常只是给你一个清单。我想。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-20
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        相关资源
        最近更新 更多