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
逻辑会是一个问题。(好吧,现在很明显,事实之后。)