1

我目前正在将 SAS 宏转换为 R 代码。我在 R 上做了很多工作,但我对 SAS 比较陌生。我无法理解合并命令的 SAS 代码 -

data dates;
merge A(keep=date rename=(date=beg))
A(keep=date firstobs= 5 rename=(date=end))
A(keep=date firstobs= 10 rename=(date=bega))
A(keep=date firstobs= 15 rename=(date=ee))
A(keep=date firstobs= 30 rename=(date=eend));
index+1;
if nmiss(beg,end,bega,eend,ee)=0; 
run;

我了解此命令将文件 A 加入自身 5 次。但我无法可视化输出。'index+1' 和 'if' 代表什么。此代码的 R 版本是什么?

4

3 回答 3

1

正如 Yick 所说,该index+1语句在您的输出数据集中创建一个新变量,该变量以 1 开头,并随着每个处理的观察值递增。

像这样使用的nmiss(...)函数称为子设置 IF表达式,这意味着具有非零结果(无缺失值)的观察结果不会写入最终数据集。

可视化结果的最佳方法是使用小型测试数据集运行此代码两次,一次使用该if语句,一次不使用。例如:

data a;
  do i=1 to 50;
     date = today() + i;
     output;
     end;
run;

data dates1;
  merge A(keep=date rename=(date=beg))
        A(keep=date firstobs= 5 rename=(date=end))
        A(keep=date firstobs= 10 rename=(date=bega))
        A(keep=date firstobs= 15 rename=(date=ee))
        A(keep=date firstobs= 30 rename=(date=eend));
  index+1;
  if nmiss(beg,end,bega,eend,ee)=0;
  format beg end bega ee eend yymmdd10.;
run;

data dates2;
  merge A(keep=date rename=(date=beg))
        A(keep=date firstobs= 5 rename=(date=end)) 
        A(keep=date firstobs= 10 rename=(date=bega))
        A(keep=date firstobs= 15 rename=(date=ee))
        A(keep=date firstobs= 30 rename=(date=eend));
  index+1;
  format beg end bega ee eend yymmdd10.;
run;

运行上述操作后,在 SAS 中打开两个数据集并并排比较它们。subsetting-IF语句的效果应该很明显,并且可能会帮助您理解这样做的原因(顺便说一句,这是一个聪明的技巧)。我添加了一个 FORMAT 语句以使其更易于查看。

于 2013-12-29T01:27:37.907 回答
1

我对 R 不太熟悉,但我知道一些 SAS。我不确定是否将其称为宏...合并数据集的输出将取决于输入数据集的外观。只需运行您的代码,您就可以在工作文件夹中看到它...

通常,数据步骤的结构类似于隐式循环。index+1看起来像具有以下语法的语句sumvariable+expression。在这种情况下,+1 之后的 index 的值将被保留用于下一次迭代。

此处的if语句包含一个布尔条件(即它可以具有 True 或 False 的值,但不能同时具有两者)以在输出数据步时设置约束。如果为真,则输出当前行数据。nmiss(var1,var2,var3,...) 是一个函数,它将返回内部指定nmiss()的缺失参数的数量。例如,如果仅缺少 var1,则 nmiss(var1,var2,var3,...) = 1。

于 2013-12-28T13:22:58.763 回答
0

我写 R 已经有一段时间了(所以这可能不是最好的代码),但这大致相当于

n = nrow(a)
dates = data.frame(cbind(
    1:(n-29),
    a[1:(n-29),"date"],
    a[5:(n-25),"date"],
    a[10:(n-20),"date"],
    a[15:(n-15),"date"],
    a[30:n,"date"]
))

names(dates) = c("index","beg","end","bega","ee","eend")

正如您所说,您将 A 合并到自身 5 次。正如其他人所说,该index+1语句仅充当行索引计数。该if nmiss(...)=0;语句意味着您只能获得所有内容都对齐的行。

所以使用cbind()R 中的函数来进行合并。 cbind()要求您在输入上具有相同的长度,因此您必须调整范围。这些范围相当于firstobs=输入数据集上的选项加上子集if ... ;语句。

于 2013-12-29T02:09:19.297 回答