SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1728|回复: 10
打印 上一主题 下一主题

高手看看如何提升这个数据处理的效率

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-9-21 16:41:14 | 只看该作者

高手看看如何提升这个数据处理的效率

由于不知道怎么贴图:(,所以只好用文字描述了:
我现在有1000万个用户数据,我需要用树形结构先对用户进行细分,然后分别统计每个细分群体的一些数据。
树形结构细分大概如下:
全体用户先分为A1、A2,然后A1又分为A1.1、A1.2,然后A1.1又继续分...
-A1
  -A1.1
        -A1.1.1
        -A1.1.2
        -A1.1.3
    -A1.2
        -A1.2.1
        -A1.2.1
...

-A2   
  -A2.1
   -A2.2
...

我现在需要用如下代码统计每个群体的数据:
proc means data=test.total(where=(x>10 and y>10)) n mean sum std min max;  /*x>10 and y>10是A1用户群的条件*/
var x1 x2 x3;
run;

由于树形结构细分的群体很多,大概有20多个,就意味着上述代码要运行20多遍(只需要改变相应where条件),这样效率太低了,不知道有没有更好的办法来提高运算效率。我的想法是给用户加上若干个分组标签,例如L1_seg表示用户属于A1还是A2;L2_seg表示用户属于A1.1、A1.2等;L3_seg表示用户属于A1.1.1 A1.1.2等,然后用如下代码:
data test.total;
set test.total;
if x1>10 and y>10 then L1_seg="A1";
if...                     then L1_seg="A2";
if..........            then L2_seg="A1.1";
...
run;
proc means data=test.total n mean sum std min max;
class L1_seg L2_seg...;
var x1 x2 x3;
types L1_seg L2_seg...;
run;

不知道是否还有更好的办法可以显著提高代码和运算效率,上面那种办法给用户加标签的时候把条件全部写出来好长啊,而且容易出错。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-9-21 17:04:59 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

用宏试试
[code:20wblkhg]%macro test(inds,x,y);
        proc means data=&inds (where=(x>&x and y>&y)) n mean sum std min max;
                var x1 x2 x3;
        run;
%mend;

%test(test.total,10,10)
%test(test.total,10,5)
%test(test.total,5,5)[/code:20wblkhg]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-9-21 17:09:31 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

用宏的本质的也是要运算20多遍,速度没有提升,我比较关心速度的提升。
此外,每一个群体中的"条件"是不同的结构,A1.1的条件就是在A1的条件基础上又多了新的条件,写macro的时候实际上要把整个条件字符串作为一个宏变量处理。

我想设计一种计算方法能让整个运算时间最短:)哈哈。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-9-21 18:36:54 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

一个很基础的问题,无须用宏. <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-9-21 21:06:26 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

to byes

是一个基础的问题,不知道你会怎么去做呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-9-22 09:22:26 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

这个树状结构的层数有多少?用层数来写标签,比直接用他们的名称写标签要简单吧?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-9-22 11:47:12 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

to tanzhen_mysas

层数一般在4-6层,所有节点数(含中间节点)在20-30个。你说的用层数来写标签如何写?我目前的想法是有多少层就要构造多少个标签变量。不知道能否更简化:)哈哈。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-9-23 12:53:59 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

[code:2am8y9xw]data test&#46;total;
  set test&#46;total;
  if x1&gt;10 and y&gt;10 then do;
     L1_seg=&quot;A1&quot;;
     if&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46; then L2_seg=&quot;1&quot;;
  end;
  else if&#46;&#46;&#46; then L1_seg=&quot;A2&quot;;
  &#46;&#46;&#46;
run;[/code:2am8y9xw]

其实主要思路和你的一样,只不过在加标签时和你的有点不一样。说不上简单,呵呵,只是另一个方法而已。
如果你的第一层的条件和第二层的条件是分开独立的话,那么各层标签的添加条件就不需要嵌套。分开写,也就最多6个而已。呵呵。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-9-23 12:59:37 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

to tanzhen_mysas

哈哈,那就是if嵌套if了,也很容易绕晕的:)
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2010-10-25 23:55:38 | 只看该作者

Re: 高手看看如何提升这个数据处理的效率

to tomwalk
format + PROC MEANS ; CLASS.....
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-3 21:48 , Processed in 0.071668 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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