【问题标题】:An efficient way to Copying values in subsequent records - SAS在后续记录中复制值的有效方法 - SAS
【发布时间】:2015-08-18 23:37:46
【问题描述】:

我有一个按源数据中的类别变量分组的数据集。例如:

Bar  | Foo1
     | Foo2
     | Foo3
Bar2 | Foo4
     | Foo5
     | Foo6

在我导入源数据后,以上将导致第一个变量(父级)填充在记录 1 上,而不是 #2 和 #3。我想将父变量的值复制到记录 2 和 3。因此我的输出看起来更像这样:

Bar  | Foo1
Bar  | Foo2
Bar  | Foo3 
Bar2 | Foo4
Bar2 | Foo5
Bar2 | Foo6 

我尝试使用“LAG”功能,但它似乎不起作用。这是我的代码:

if PARENT ~= "" then do;
   PARENT = PARENT;
end;
else do;
   PARENT = LAG(PARENT);
end;

【问题讨论】:

  • retain 是解决此问题的一种方法。检查this retain question是否可以帮助您。
  • lag() 再次来袭……
  • 我认为这已经得到了比那个更好的答案,所以我将在这个方向上关闭作为重复。将来可以随意将其标记为重复关闭 - 特别是,如果有人已经这样做并且这是正确的,请随时将更好的答案放在重复项上,因为我会朝那个方向关闭它。

标签: sas


【解决方案1】:

另一种方法是添加一个虚拟变量,然后使用 Update 语句欺骗 SAS。

data have;
infile cards dlm='|';
    input (var1 var2) (:$8.);
    retain idx 1;
    cards;
Bar  | Foo1
     | Foo2     
     | Foo3
Bar2 | Foo4
     | Foo5
     | Foo6
     ;

data want;
    update have (obs=0) have;
    by idx;
    output;
    drop idx;
run;

【讨论】:

    【解决方案2】:

    lag 函数返回调用时传递给它的最后一个值,而不是最后输出的值。

    您可以执行以下操作:

    data want;
        set have;
        length last_parent $256;
        retain last_parent;
    
        if parent = "" then parent = last_parent;
        else last_parent = parent;
    
        drop last_parent;
    run;
    

    您需要将 last_parent 的长度设置为与 parent 相同的长度,以确保没有任何内容被切断。

    【讨论】:

    • @LeoGreyz 谢谢。这就是解决方案。不幸的是,另一个类似的答案比你早了几秒钟,所以我不得不接受它作为“已接受的答案”。
    【解决方案3】:

    您可以保留非缺失值并将其应用于任何缺失值,例如

    数据要; 设置有; 长度最后 10 美元。 ; 保留最后一个 '' ; 如果没有丢失(PARENT) 那么 last = PARENT ; 否则父母=最后; 最后下降; 跑步 ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2021-08-31
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      相关资源
      最近更新 更多