SAS中文论坛
标题:
急!如何避免由于fieldname重而错误覆盖?
[打印本页]
作者:
shiyiming
时间:
2005-12-18 15:32
标题:
急!如何避免由于fieldname重而错误覆盖?
本人在银行做数据分析员, 平时的工作是用sas做数据处理和数据分析, 很多时候会用merge两个dataset做数据合并, 如:
data t1;
length key 8.
fieldname1 $2.
fieldname2 $2.
run;
data t2;
length key 8.
fieldname1 $2.
fieldname3 $2.
run;
data t3;
merge t1
t2;
by key;
run;
这里merge时 t2.fieldname1就会不知不觉的把t1.fieldname1的数据覆盖掉了,
由于有时程序规模较大, 光考肉眼很难避免fieldname是否重复,增经有由于两个dataset的fieldname相同而数据相互之间覆盖的现象, 本人想问一下SAS里有没有机制避免此情况发生?或者是否有其他更好的方法进行数据合并从而避免此情况发生?谢谢了,明天就要开会了,还要和老板交代,不知怎办,望各位高人指点迷津, 万分感谢!!
作者:
shiyiming
时间:
2005-12-19 18:12
标题:
你是什么银行的?
老老实实的用SQL SELECT 来RENAME.虽然方法笨,但是是规范的.你至少知道你在做什么.
或者在MERGE前就找出相同变量名再做处理.
如果你想自动完成.得到的变量名也基本上是arbitrary的,比如两个A,处理后为A1,A2,等.而你根本就不知道A1 A2是自动生成的.(如果你知道,那你预先就应该RENAME.再MERGE)
代码的可读性,效率都是要考虑的.
我真希望不要是你们银行的客户.没法给老板交待就好好记得教训.下次不要再犯.
做这种事就应该有一个规范的方法.不要投机取巧.(如果只是从技术上讨论问题.我们可进一步讨论).
<!-- s:oops: --><img src="{SMILIES_PATH}/icon_redface.gif" alt=":oops:" title="Embarassed" /><!-- s:oops: -->
作者:
shiyiming
时间:
2005-12-19 23:53
标题:
谢谢ahuige
很高兴得到ahuige的建议, 很希望能和你能进一步讨论一下:
不知ahuige所说的“SQL SELECT 来RENAME”是指什么, 我的理解是通过rename给各个dataset的field加前缀, 以此区分不同dataset的feild名, 其实这个方法我们也曾经考虑过,我们也有一段时候对某些程序应用如此的标准, 但是由于我们要处理的dataset的field数量较多, 一般为几时个, 这样一进一出都要rename的话不但代码量是惊人的,并且这样反而降低了可读性, 给以后的维护带来困难, 举个例子:
data t1(keep=f1 f2 f3 f4...);
....
run;
data t2(keep=fa fb fc fd...);
....
run;
data t3(keep=t3.f1
...
t3.fa
...);
merge t1(rename=(f1=t1.f1
f2=t1.f2
f3=t1.f3
f4=t1.f4
...
))
t2(rename=(fa=t2.fa
fb=t2.fb
fc=t2.fc
fd=t2.fd
...
));
by key;
rename t1.f1=t3.f1
...
t2.fa=t3.fa
...
run;
这样代码量起码是原来的几倍, 可能会出现吃力不讨好的情况.
我们现在的解决方法是在读入dataset之前写keep来提醒自己各自dataset的field名,希望能较清晰各dataset现有的feild:
data t3(keep=f1...
fa...);
merge t1(keep=f1
...)
t2(keep=fa
...);
run;
但是这种keep的方法也只能依靠程序员肉眼去留意, 其实我比较感兴趣的是不知sas有否一种系统检查机制能够检查出重field并对此作处理和提示(我以前写过oracle的存储过程, 他们也有这样一套机制), 如warning, exception, 等等, 如此就会减低出错的机会.
很感兴趣ahuige所说的“如果你想自动完成.得到的变量名也基本上是arbitrary的,比如两个A,处理后为A1,A2...”不知在sas怎样实现, 望指点, 万分感谢!:)
作者:
shiyiming
时间:
2005-12-20 09:44
标题:
试试吧,现在在上班,不能研究通用方法,
你用SQL的时候,会自动提示重复的变量名的.
试试吧,现在在上班,不能研究通用方法,不过我还是认为你这种理由太牵强.
什么几十个变量就怕麻烦不去用规范的步骤.
这是银行,不是自己搞着玩.几十个变量名就叫苦.
可以分几步,第一步用这种方法来生成临时数据,得到重复字段名的提示.
然后显式的处理重名字段.
你上面的方法不清晰是没有好好考虑如何让它清晰.
[code:abadd]data a;
input key x y;
cards;
1 2 3
2 4 5
;
run;
data b;
input key y z;
cards;
1 6 9
2 9 7
;
run;
PROC SQL;
create table c as
select *
from a,b
where a.key=b.key
;
run;[/code:abadd]
[quote:abadd]WARNING: Variable key already exists on file WORK.C.
WARNING: Variable y already exists on file WORK.C.
[/quote:abadd]
作者:
shiyiming
时间:
2005-12-20 10:02
标题:
to birdtofrog
在你能够保证逻辑正确性的情况下,运行merge比sql快,尤其是在SAS/SPDS中。不过sql的确通俗易懂,比较好维护。
作者:
shiyiming
时间:
2006-1-2 17:30
标题:
thx
谢谢楼上的意见啦,我想用merge从效率合方便性应该比sql好,不过为避免重fields,用sql也不失为一种办法 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
欢迎光临 SAS中文论坛 (http://mysas.net/forum/)
Powered by Discuz! X3.2