SAS中文论坛

标题: 快速替换? [打印本页]

作者: shiyiming    时间: 2011-3-13 22:58
标题: 快速替换?
array ff[250] (1,2,3....,250);
c='这一天ff(4)在ff(1)上看到ff(3)和ff(14)在做ff(8)';

这个如何快速用ff里元素的值快速替换呢?谢谢!

我是想那个ff[250]里面的数有重复的,然后不要其中某些部分,然后剩下的元素做去重复处理。
这样一个array,用do做循环,直接可以替换。不知可有办法?
作者: shiyiming    时间: 2011-3-14 10:26
标题: Re: 快速替换?
你是不是有办法 ?看是否和下面一致。

不知道你说的快速要多快,SAS的循环还是很快的。

数据的数量级大就用宏吧。

[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里呢?

要么就得用通配符直接扫字符串,把符合规定的找出来进行替换了~

谢谢!
作者: shiyiming    时间: 2011-3-14 17:59
标题: Re: 快速替换?
ps: 老K,麻死啦 !

你说的好像两个问题,前一个问题对于SAS里面已定义变量长度不能变的原则,我是没好办法的。

后一个问题好像是数组压缩问题,找个类似的C代码吧。不过那是减少空间的,对于速度是否有帮助就不清楚了。

以前尝试用自定义函数里面数组存点数据,未遂,如果方便,代码发我学习学习。
作者: shiyiming    时间: 2011-3-14 19:00
标题: Re: 快速替换?
我正想这事儿呢~
fcmp的array支持一开始设置个[1],然后再扩充没问题

我是想,重复的问题可以这么解决,反正数组里是正整数。
array ff[250] (1,2,3....,250);

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里面用就比较方便了。

[code:ac384sto]
proc fcmp;
   array x&#91;12&#93; (1 1 1 2 2 3 3 4 4 5 5 6);
   rc = write_array('myarray', x);
run;

proc sql noprint;
        select count(unique(x1)) into&#58; obs_num
        from myarray;
        create table myarray1 as
        select distinct *
        from myarray
;quit;

proc fcmp;
   array x&#91;&amp;obs_num&#93; / nosymbols;
   rc = read_array('myarray1', x);
   put x=;
run;
[/code:ac384sto]
作者: shiyiming    时间: 2011-3-16 10:27
标题: Re: 快速替换?
K总要的是速度,不是上面速度如何 ?

to super kuhasu:我很好奇,你的数组到底有多大啊?
作者: shiyiming    时间: 2011-3-16 10:30
标题: Re: 快速替换?
非常感谢!

这方面sas的确特有待加强。fcmp的效率普遍偏低,和以前的期望也想去甚远。
作者: shiyiming    时间: 2011-3-16 10:41
标题: Re: 快速替换?
ro sxlion
数组倒是不大,一百多万而已。
只不过,现在遇到的主要问题是宏变量解析的问题:log(5)+exp(cc(1))
cc(1)是数组元素
上式要在一个data步中赋值给一个宏变量mm,然后变量赋值dd=&amp;mm.;就可以直接代入cc(1)得结果。
可是sas一个data步内的,对于exp,log这样的会报错,而其他的,大多得明确标示run,这个跟设计的宏的工作流程有关。
然后sasl有提出来用fcmp里的run_macro的,很慢,本来我想,这个东西虽然慢,但是可以data步中嵌套data步,可以做宏变量赋值,然后在原始data步中直接变量赋值不就行了,可是试了下,好像不行。。。SAS本身没有data步中字符串转化成公式计算的函数,上面的式子如果是变量赋值,一开始字符串,之后也还是字符串~
作者: shiyiming    时间: 2011-3-20 23:40
标题: Re: 快速替换?
大胖猫看了super k兄这里的帖子,还有SAS-L的帖子,好像是要实现这个目地把。
[quote:wu43uwqk]%eval和%SysEvalF在解析的时候有问题。
如果有这样的函数就好了
data _null_;
a=&quot;52&quot;;
b=&quot;+23*log(4)&quot;;
c=TheFunction(a,b);
put c=;
run;
/*log:
c=83.884770306
*/ [/quote:wu43uwqk]

我怀疑其他语言,scripting或者complied,也不能也实现这个function, 机器应该无法知道你要想输入的是字符还是数字。大胖猫觉得首先要做的是用regular expression 把数字和表达式分离,这可能是几步的过程。
作者: shiyiming    时间: 2011-3-21 00:01
标题: Re: 快速替换?
但是其实
%let c=exp(5)+log(7);
d=&amp;c.;
就直接解析了。
关键问题在于
1.上述类型表达式如果是引用的变量c=exp(5)+log(7),然后再赋值给宏变量,则一个data步内不可解析;
2.没有把字符串进行返回计算结果的函数。




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2