SAS多数据集和Coalesce函数

时间:2017-11-21 11:30:28

标签: sas dataset coalesce

美好的一天,

我有不同格式的旧数据,并用新的更新。想法是变量------------------TestDirective.js--------------------------- define(['app'],function(app){ app.directive('testDirective',function(){ return{ restrict: 'E', templateUrl: 'js/TestDirective.html', link: function(scope){ scope.innerVariable = "Inner variable"; scope.ourterVariable = scope.testMessage; scope.testFun = function(){ ///To access ParentCtrl variable use scope var pv = scope.parentVariable; } } } }); }); 是用下划线WantedName编写的,而新数据是没有这个。不过我没什么大不了的。

编辑:Wanted_NameWantedName是SAS日期。

原始数据:

Wanted_Name

从2015年开始:

year Wanted_Name 
2013  1234       
2013  4321       
2013  3241       

我尝试了逻辑:

year WantedName 
2015 5678     
2015 8765
....

不。不工作。出于某种原因,它取了%macro macro_env; data _null_; call symput ("curr_year", year(date()) ); run; data long_data; set %do year=2013 %to &curr_year.; data.history&year. %end; ; WantedName=COALESCE(WantedName, Wanted_Name); run; %mend macro_env; 的第一个值并粘贴在整个数据范围内,除了新数据:

Wanted_Name

现在我设法通过删除year Wanted_Name WantedName 2013 1234 1234 2013 4321 1234 2013 3241 1234 .... 2015 . 5678 2015 . 8765 函数并添加其他数据语句来修复此问题:

coalesce

问题:发生了什么或为什么原始的macro_env不起作用?

我认为data long_data; set %do year=2013 %to &curr_year.; data.history&year. %end; ; run; data long_data; set long_data; WantedName=COALESCE(WantedName, Wanted_Name); run; 中的数据集首先被加载然后应用了函数。 (哪个在后面的数据声明中工作。显然不是......也许?

3 个答案:

答案 0 :(得分:4)

作为答案形式,@ Allan Bowe解释了问题是源自数据集的变量会自动保留。所以你可以添加代码来清除它们。

data long_data;
  set data.history20: ; 
  WantedName=COALESCE(WantedName, Wanted_Name);
  output;
  call missing(wantedname,wanted_name);
run;

或制作一个新变量。

data long_data;
  set data.history20: ; 
  new_WantedName=COALESCE(WantedName, Wanted_Name);
  format new_WantedName date9. ;
  drop WantedName Wanted_Name ;
  rename new_WantedName = WantedName ;
run;

答案 1 :(得分:2)

原因是pdv隐式保留已经“设置”的变量,并且在加载早期数据集(2015年之前)时,wantedName没有从pdv中刷新。

编译器为它创建了一个空间(通过读取set语句中的所有数据集),但set命令没有(最初)替换wantedName的值。

所以 - 当第一个观察结果被阅读时,wantedname缺失,wanted_name的第一个值被应用。

WantedName=COALESCE(., 1234); /* obs 1 */

在第二次迭代中,wantedname的值已被保留,因此用于每次后续迭代,直到读取包含wantedname的数据集。

WantedName=COALESCE(1234, 4321); /* obs 2 */

第二个示例使用从头开始的具有wantedname变量的数据集。

很棒的问题!

答案 2 :(得分:2)

我认为更好的方法是在set语句中使用rename来处理它。

data long_data;
    set 
    %do year=2013 %to &curr_year.;

        data.history&year.
          %if &year lt 2015 %then %do;
           (rename=wanted_name=wantedname)
          %end;
    %end;
    ;
run;

更便宜(重命名比coalesce功能便宜)并且更简单。