【问题标题】:SAS to R conversion of mergeSAS 到 R 的合并转换
【发布时间】:2013-12-28 12:47:58
【问题描述】:

我目前正在将 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 版本是什么?

【问题讨论】:

  • 您是否尝试过运行代码并查看合并后的输出?如果您无法将其可视化,则最好观察输出并阅读日志。干杯。
  • 不。我通常是这样工作的,但我没有 SAS 许可证。

标签: r indexing sas sas-macro merging-data


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    像这样使用的nmiss(...) 函数称为sub-setting 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 语句以使其更易于查看。

    【讨论】:

    • 问题是我没有 SAS 许可证,所以我无法测试代码。这就是为什么整个混乱。但感谢您的回答。它有助于理解 Index 语句。
    【解决方案3】:

    我写 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; 语句意味着您只能获得所有内容对齐的行。

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

    【讨论】:

    • 非常感谢!我会试试这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多