假设我已经通过变量'sticks','stones'和'bones'对set1和set2进行了排序,然后我这样做:
data merged;
merge set1(in=a) set2(in=b);
by sticks stones bones;
if a and b then output;
*else we don't want to do anything;
run;
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以从合并数据集中的set2中删除所有变量,而无需全部键入它们?我一直遇到这个问题,我有两个数据集 - 都有很多变量 - 我只想用几个变量合并它们,然后只保留其中一个变量的变量.
我通常只是使用proc sql这样的东西,但有一些情况(比上面更复杂)我认为合并更好.
此外,我发现SAS要求您在合并数据集之前"手动"对数据集进行排序,这令人烦恼.如果它不允许你合并数据集,除非它们被正确排序,为什么它不是只在你使用合并时为你做?思考?也许有一种解决方法,我不知道.
小智 8
排序的需求用于合并语句和PDV在其中的工作方式.真的没有办法解决它.
然而,这里基本上你正在查找set2,以确保你通过相当于内连接的关键变量匹配(坚持石头骨骼),你可以通过哈希表或使用键设置更有效(如果你有一个索引).
这里你想要的最简单,最方便的方法是在set2中使用keep语句,这样你只需要通过变量加载到PDV中.像这样的东西:
data merged;
merge set1(in=a) set2(in=b keep=sticks stones bones);
by sticks stones bones;
if a and b then output;
*else we don't want to do anything;
run;
Run Code Online (Sandbox Code Playgroud)
如果哈希表没有吓到你,并希望在这种情况下了解如何实现它们的更多信息,请随时与我联系以获得更多帮助.
编辑:
这是一篇关于使用哈希表的好文章http://www.nesug.org/proceedings/nesug06/dm/da07.pdf 请记住,使用哈希值你应该知道你在做什么,如果你使用哈希表可能会产生意想不到的结果不知道引擎盖下发生了什么.无论如何,使用非常简单和基本的哈希表解决了问题
data merged2;
set set1;
if _N_ = 1 then do;
declare hash h(dataset:"set2");
h.defineKey('sticks','stones','bones');
h.defineData('sticks','stones','bones');
h.defineDone();
end;
rc = h.find();
if rc=0;
drop rc;
run;
Run Code Online (Sandbox Code Playgroud)
此代码的主要优点是不需要对数据集进行排序,以防set2特别大,节省了大量时间.
| 归档时间: |
|
| 查看次数: |
3444 次 |
| 最近记录: |