[code:3j2gqe43]data ex;
array ff[250] _temporary_ ;
do i=1 to 250;
ff[i]=i;
end;
c='这一天有个ff(4)在ff(1)上看到ff(3)和ff(14)在做ff(250)';
do i=1 to 250;
if i=1 then x=c;
if i<10 then do;
f2=put(ff(i),z1.);
f1='ff('||put(i,z1.)||')';
x=tranwrd(x, f1, f2);
end;
else if i<100 then do;
f22=put(ff(i),z2.);
f11='ff('||put(i,z2.)||')';
x=tranwrd(x, f11, f22);
end;
else if i<=1000 then do;
f222=put(ff(i),z3.);
f111='ff('||put(i,z3.)||')';
x=tranwrd(x, f111, f222);
end;
end;
drop f1 f11 f111 f2 f22 f222;
put x=;
run;
[/code:3j2gqe43]作者: shiyiming 时间: 2011-3-14 15:15 标题: Re: 快速替换? 亲爱的,代码有点儿多。
有没有array操作方法,可以筛选array的元素,然后这些元素包括重复的,组成一个非重复元素构成的array呢?
fcmp支持临时数组array a[1]数组元素扩展,这样只需要解决重复的问题。
及如何在循环ff的时候快速找出来不重复的元素防到a里呢?
array dd[1] _temp_;
do i=1 to 250;
dd(ff(i))=ff(i);/*这样就是按值赋值,有重复的,也直接覆盖赋值了*/
end;
但是生成的dd[*],我想把非空值的去掉,现在想不是又得再来个数组,进行空值判断,然后再条件赋值。
array rr[1] _temp_;
j=1;
do i=1 to dim(dd);
if dd(i)^=. then rr(j)=dd(i);
j+1;
end;
可是这样依旧比较慢~~~要是有个直接的函数或者什么方法一下子去除掉重复的就好了~~作者: shiyiming 时间: 2011-3-15 01:13 标题: Re: 快速替换? call me dummy, but I don't understand what you want to do.
If you simply want to drop duplicated elements in an array, maybe you can try HASH table, using the uniqueness feature of a HASH table to eleminate duplicated elements, then put every distinct elements into a new array
this approch is slow in execution, but easier to code, so saving human hours, and maybe faster than FCMP.作者: shiyiming 时间: 2011-3-15 09:28 标题: Re: 快速替换? Thanks~
It's a part of the code in FCMP <!-- s:-D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":-D" title="Very Happy" /><!-- s:-D -->作者: shiyiming 时间: 2011-3-15 23:24 标题: Re: 快速替换? k兄作数值计算的吧,大胖猫也改写过一些金融模型,感觉SAS不如R,Matlab,Python方便,像K兄这个问题用Python,set()一下就完了。像k兄说的,SAS里面的fcmp也可以,不过有些麻烦,需要导进导出。如果经常用,应该可以用macro封装proc sql作一个subroutine, 比如叫deldup_array(),以后在fcmp里面用就比较方便了。