SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 803|回复: 5
打印 上一主题 下一主题

急!如何避免由于fieldname重而错误覆盖?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2005-12-18 15:32:19 | 只看该作者

急!如何避免由于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里有没有机制避免此情况发生?或者是否有其他更好的方法进行数据合并从而避免此情况发生?谢谢了,明天就要开会了,还要和老板交代,不知怎办,望各位高人指点迷津, 万分感谢!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2005-12-19 18:12:57 | 只看该作者

你是什么银行的?

老老实实的用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: -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2005-12-19 23:53:41 | 只看该作者

谢谢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怎样实现, 望指点, 万分感谢!:)
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2005-12-20 09:44:45 | 只看该作者

试试吧,现在在上班,不能研究通用方法,

你用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&#46;key=b&#46;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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2005-12-20 10:02:48 | 只看该作者

to birdtofrog

在你能够保证逻辑正确性的情况下,运行merge比sql快,尤其是在SAS/SPDS中。不过sql的确通俗易懂,比较好维护。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2006-1-2 17:30:42 | 只看该作者

thx

谢谢楼上的意见啦,我想用merge从效率合方便性应该比sql好,不过为避免重fields,用sql也不失为一种办法 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-9 10:23 , Processed in 0.068856 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表