SAS学习
听说在学习软件的过程当中记录下自己的学习过程以及遇到的问题和解决的方法,并使用文字有逻辑清晰的记录下来,会成长的更快一下。所以新手宝宝就上路了。
首次接触sas是在进入公司之后,准确的日期是在2017年7月11号。虽然进入公司是在7月10号,但是由于电脑在10号还没有配置好,所以我就是在7月11号开始正式接触的SAS软件。到今天记录的时间也有1个月20天了。前期一直兵荒马乱的接触SAS或者和工作相关的内容,自己也没有想起来应该记录一下自己的SAS之路,所以一直拖延到了现在。
SAS是Statistical Analysis System的简称,即统计分析软件。目前在统计分析、数据分析等有很强大的功能。
又因为前面在学习sas的过程中遇到的问题并没有记录,但是如果从第一天起今天的工程量显得有一点浩大,所以当断不断,决定就从今天开始做起。但是在更新中如果有空想起来了以前做过的或者遇到的问题,也会记录下来的。
日期:2017年08月31日
记录人:Golden
背景介绍:由于刚开始进入公司,所以首先对我们进行了一些培训,而在这些培训完成之后,就需要自己的monitor对我们进行一些指导,而我的monitor对我进行的指导首先就是扔给了我一堆数据,让我先从做listing开始。然后我在monitor交给我任务一周之后2017年08月21日,我开始进行了这些Listing的作业。并且在今天也就是08月31日大致完成了第一遍的listing。
问题1:
问题发现日:2017年08月31日
描述:昨天下午下班的时候我就大概完成了这些表,但是昨天在做最后一个listing的时候,我遇到了一个问题:那就是我的lisitng和monitor给的listing有一些不一样。但是已经下班了,我就先下班了,也没有多想,觉得应该是页数page中观察值observation行数的设置问题。所以就非常开心的下班回家了。然而今天早上到了之后磨了一会儿洋工之后发现,其实并不单单只是page中observation的行数的问题,那都是小问题。重点是为什么每次proc report 的define中的COL2若是选择了order,那么page1中的内容就和标准Listing是一样的,但是弱是没有选择order,那么就根本不一样。
我想了一下,这绝对不是order的原因,一定是其他的原因,确实是因为其他的原因。在进行proc report之前,我对两个数据集进行了merge. 这个地方我们假设dataset1和dataset2. 这两个数据集中都有三个变量,前两个变量的变量名是相同的,此时仍然设置为COL1和COL2;第三个变量是不相同的,dataset1是visit_1,dataset2是visit2。现在的目标就是想要把COL1和CoL2留下来,对两个数据集进行merge形成数据集Final(COL1, COL2, visit_1, visit_2)。而我进行的merge过程是:
DataFinal;
Merge dataset1 dataset2;
By COL1;
Run;
想必聪明的小伙伴一定看出来我的数据集Final为什么错了吧。
没错,就是merge by的错。我们知道对于sas中data步骤当中的merge来说,如果merge的两个数据集有除了By变量之外的其他变量名是相同的,此处是COL2,那么后一个数据集当中的COL2的值将会覆盖前一个数据集中的COL2。
Example:可以看一个简单的例子:
data test; input x y; cards; 1 2 3 4 ; run; data test2; input x y z; cards; 1 3 4 3 2 4 ; run; data test3; merge test test2; by x; run; | 分析:在最后的test3中merge的是数据集test和test2;但是by的是x;以为数据集test和test2中都有变量y。所以导致test3中出现的y的值是test2的值,即test中的y被test2中的重写。
|
解决:那么对于着这种情况我的解决方法是:我首先想到了在进行merge by的时候可以把两个数据集当中相同的变量COL2也加进去。然后我急立马急冲冲的加上了,但是结果更加离谱了,观测值都不对了,肯定不对。所以又查询了merge by 的用法,确定了by 之后是可以添加多个变量名的,但是需要有一个前提,那就是在进行merge之前,进行merge by 的变量需要进行proc sort一下。我就豁然开朗的照做了,然后终于出现了我想要的结果。
然后有关merge这块地方引出的问题就这么解决了。之后突然想起来好几个其他的listing我也是那么做的,所以应该也是有偏差的,我就赶紧把所有的listing中用到这样的merge的情况都照做了。也就是说,merge在我做listing引发的小地震就此平息了一个。
Key1: merge by 时,两个数据集有相同的变量要小心覆盖。若要在by之后使用多个变量避免进行这种情况,那么一定不要忘记by后所跟的变量在进行by之前需要先进行proc sort一下。
问题2:
问题发现日:2017年08月31日
才刚刚平息了一个由于merge by所造成的小地震,接着在我修改前面的时候我又发现了merge造成的另外一个问题。这一次是我做的第一个listing出了问题。
描述:这个listing需要从两个数据集当中提取data,并且由于我是第一次接触,所以其他的类似于sql语句也完全没有想起来,脑海里面飘过了merge的身影,立马就想到了使用merge by这个可以合并数据集的statement. 但是我当时仍然没有考虑到的还是那个问题:就是两个数据集中有许多的列变量variable-name都是一样的,而merge by有一个致命的点就是:如果merge的两个数据集中除了by之外的变量有相同的,那么后一个数据集中的variable的value会覆盖前一个dataset中的variable的value. 所以当时出现的很多warining: xxx已被改写。但是我为什么当时居然连注意都没有注意到!!!!!!!!
解决:但是这两个数据集中有一个数据集不是很大,所以我就有了其他的想法:
Step1: 先将数据集比较大的一个即dataset1中需要使用的两列取出来(使用了set加keep语句)——生成新的数据集Final_1。
Step2:在使用data步对Step1中生成的Final_1和dataset2进行merge by。(由于这个listing着重需要dataset2当中的观测值,因此还对dataset2使用了in 选项)。如下:
Data Final_1; Set dataset1; Keep by_var need_var; Run; | Data Final; Merge Final_1 dataset2(in=A); By by_var; If A=1; Run; |
这样就解决了这个由于merge引发的小小地震!!!!!!!
接下来希望遇到的问题都可以在思考之后慢慢解决!