SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1594|回复: 12
打印 上一主题 下一主题

快速替换?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-3-13 22:58:20 | 只看该作者

快速替换?

array ff[250] (1,2,3....,250);
c='这一天ff(4)在ff(1)上看到ff(3)和ff(14)在做ff(8)';

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

我是想那个ff[250]里面的数有重复的,然后不要其中某些部分,然后剩下的元素做去重复处理。
这样一个array,用do做循环,直接可以替换。不知可有办法?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-3-14 10:26:55 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-3-14 15:15:33 | 只看该作者

Re: 快速替换?

亲爱的,代码有点儿多。
有没有array操作方法,可以筛选array的元素,然后这些元素包括重复的,组成一个非重复元素构成的array呢?
fcmp支持临时数组array a[1]数组元素扩展,这样只需要解决重复的问题。
及如何在循环ff的时候快速找出来不重复的元素防到a里呢?

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

谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-3-14 17:59:50 | 只看该作者

Re: 快速替换?

ps: 老K,麻死啦 !

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

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

以前尝试用自定义函数里面数组存点数据,未遂,如果方便,代码发我学习学习。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-3-14 19:00:34 | 只看该作者

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;

可是这样依旧比较慢~~~要是有个直接的函数或者什么方法一下子去除掉重复的就好了~~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-3-15 01:13:35 | 只看该作者

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.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-3-15 09:28:40 | 只看该作者

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 -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-3-15 23:24:58 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-3-16 10:27:11 | 只看该作者

Re: 快速替换?

K总要的是速度,不是上面速度如何 ?

to super kuhasu:我很好奇,你的数组到底有多大啊?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-3-16 10:30:27 | 只看该作者

Re: 快速替换?

非常感谢!

这方面sas的确特有待加强。fcmp的效率普遍偏低,和以前的期望也想去甚远。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-11 11:31 , Processed in 0.154456 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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