我的数据看起来像这样,
S. No AB001A AB0002A AB362 VAR1 VAR2 VAR3 SUM %Match Rank
1 -/- C/C A/A
2 C/C C/C A/A
3 C/C C/C A/A
4 C/C C/C A/A
5 C/C C/C A/A
6 C/C C/C A/A
7 C/C C/C A/A
8 -/- -/- -/-
9 C/C C/C A/A
10 C/C C/C A/A
11 -/- C/C A/A
12 C/C C/C A/A
13 C/C C/C A/A
14 C/C C/C A/A
16 C/C -/- A/A
17 -/- C/C A/A
18 C/C C/C A/A
19 C/C C/C A/A
我想将obs 3与obs 2匹配,如果它完全匹配则得分将为1,否则将存储在var1中为AB001a,在var2中为ab0002a,在var3中为ab362,我想计算所有的总和1和观察匹配百分比及其排名(前十名匹配者), 我在excel中成功完成了这项工作,但是我花了很多时间,如果条件在excel中使用(= if(A3 = A $ 2,1,0)然后我在所有的blind中拖动,我做了所有obs的总和,他们的%匹配和排名。 我的问题是如何在sas中做到这一点?我可以使用数组吗?或者循环和数组的组合?我的数据是如此之大,有5,15,567个障碍物。 任何人都可以指导我如何在sas中执行此操作,因为我希望减少分析数据的时间。 感谢您 的问候,
答案 0 :(得分:0)
如果您只是总结了3个变量,则不需要使用循环或数组,但如果有更多变量,我会使用数组。我正在使用LAG功能来执行此任务,它需要一定程度的小心,以确保它按您想要的方式工作。确保你不使用IF ... THEN ... ELSE语句。我已计算除Rank之外的所有汇总统计数据,因为我不确定您排名的变量。如果您在在线文档中查看PROC RANK,那么您应该能够找出要做的事情。 希望这会有所帮助。
data have;
input S_No AB001A $ AB0002A $ AB362 $;
datalines;
1 -/- C/C A/A
2 C/C C/C A/A
3 C/C C/C A/A
4 C/C C/C A/A
5 C/C C/C A/A
6 C/C C/C A/A
7 C/C C/C A/A
8 -/- -/- -/-
9 C/C C/C A/A
10 C/C C/C A/A
11 -/- C/C A/A
12 C/C C/C A/A
13 C/C C/C A/A
14 C/C C/C A/A
16 C/C -/- A/A
17 -/- C/C A/A
18 C/C C/C A/A
19 C/C C/C A/A
;
run;
/* count number of variables starting with AB */
proc sql noprint;
select (count(*) into :num_ab
from dictionary.columns
where libname='WORK' and upper(memname)='HAVE' and name eqt 'AB';
quit;
%put numvars = &num_ab.;
data want;
set have;
array mole{&num_ab.} AB: ;
array newvar{&num_ab.} var1 - var%left(&num_ab.);
do i=1 to dim(mole);
newvar{i} = (mole{i}=lag(mole{i}));
end;
sumvar=sum(of var1-var%left(&num_ab.));
match_pc=sumvar/&num_ab.;
drop i;
run;