SAS多数据集和合并函数

SAS多数据集和合并函数,sas,dataset,coalesce,Sas,Dataset,Coalesce,你好 我有不同格式的旧数据,并用新数据更新。其思想是变量WantedName是用下划线WantedName编写的,而新数据中没有下划线。我想没什么大不了的 编辑:WantedName和WantedName是SAS日期 原始数据: year Wanted_Name 2013 1234 2013 4321 2013 3241 从2015年起: year WantedName 2015 5678 2015 8765 .... 我试过这样

你好

我有不同格式的旧数据,并用新数据更新。其思想是变量
WantedName
是用下划线
WantedName
编写的,而新数据中没有下划线。我想没什么大不了的

编辑:
WantedName
WantedName
是SAS日期

原始数据:

year Wanted_Name 
2013  1234       
2013  4321       
2013  3241       
从2015年起:

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;
没有。不起作用。出于某种原因,它取了
want_Name
的第一个值,并将其粘贴到除新数据外的整个数据范围:

year Wanted_Name WantedName
2013  1234        1234
2013  4321        1234
2013  3241        1234
....
2015  .           5678     
2015  .           8765
现在,我通过删除
coalesce
函数并添加一条额外的数据语句,解决了这个问题:

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;
问题:发生了什么,或者为什么原始宏环境不工作?


我认为
set
中的数据集首先加载,然后应用函数。(这在后一个数据语句中起作用。显然不是……可能?

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

编译器(通过读取set语句中的所有数据集)为其留出了空间,但set命令(最初)不会替换
wantedName
的值

因此-当读取第一个观察值时,
wantedname
丢失,并应用
wantedname
的第一个值

WantedName=COALESCE(., 1234); /* obs 1 */
在第二次迭代中,
wantedname
的值被保留,因此用于后续每次迭代,直到读入包含
wantedname
的数据集

WantedName=COALESCE(1234, 4321); /* obs 2 */
第二个示例从一开始就使用了一个数据集,该数据集具有
wantedname
变量

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;

好问题!

正如回答表单@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;

我认为更好的方法是在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;

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

true,这将是实现预期结果的更好方法。或者使用
proc数据集
永久重命名旧文件。true+1。这个问题的动机主要是学习一些东西。我从来没有考虑过
pdv
逻辑会是一个问题。(好吧,现在很明显,事实之后。)