全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1624 8
2016-04-05
数据样式如下:
Z变量      X 变量          Y 变量      
A          7000              1000   
A          7000              2000
A          7000                500
A          7000                600
B          5000              1000   
B          5000              2000
B          5000              2500
B          5000              3000
希望达到如下结果,
(1)A公司的7000首先对Y进行依次分配,先分配1000,剩下了6000,再分配2000,剩下了4000接着分配500和600,还剩下
7000-1000-2000-500-600=2900.这2900进行单独列示。
(2)对B公司一样地,先把5000分配1000,接着2000,剩下的2000不够2500了,就把2000填上
Z变量      X 变量          Y 变量      W变量
A          7000              1000         1000
A          7000              2000         2000
A          7000                500          500
A          7000                600          600
A                                              2900
B          5000              1000        1000
B          5000              2000        2000
B          5000              2500        2000
B          5000              3000            0


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-4-6 04:46:28
data b;
set a;
w=y;
run;
proc sql;
create table c as
select z,sum(w) as total
from b
group by z;
quit;
proc sort data=b;
by z;
run;
proc sort data=c;
by z;
run;
data d;
merge b c;
by z;
w=x-total;
x=.;
y=.;
run;
proc sort data=d nodupkey out=temp ;
by z;
run;
data final;
set b temp(drop=total);
if w<=0 then w=0;
run;
proc sort data=final;
by z;
run;

水平有限,用了很笨的方法,坐等大牛指教。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-6 09:37:05
比我的方法简便了很多。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-6 10:38:16
data aa;
input z $ x y;
cards;
A          7000              1000   
A          7000              2000
A          7000                500
A          7000                600
B          5000              1000   
B          5000              2000
B          5000              2500
B          5000              3000
;
run;
proc print; run;
proc sort data=aa out=bb; by z x; run;
proc print data=bb; run;

data cc;
        set bb;
        by z;
        retain temp 0;
        if first.z then temp=x-y;
        else temp=temp - y;
run;

proc print; run;

data want;
    set cc;
    if temp<0 then group='N';
    else group='P';
run;
data want2;
    set want;
    by z group notsorted;
        temp1 = temp;
        lag_temp = lag(temp);
                if group='N' then
                        if first.group then temp1 = lag_temp;
                        else temp1=0;

run;
proc print; run;

data want3;
        set want2;
        if group='N' then temp=temp1;
        keep z x y temp;
run;
proc print; run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-6 20:07:52
67890 发表于 2016-4-6 10:38
data aa;
input z $ x y;
cards;
似乎运行出来的结果和想要的 有点不一样。不过还是非常感谢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-6 22:01:37
proc sort data = orig ;
  by z ;
run ;

data new (drop=x_hold);
  set orig ;
  by z ;
  retain x_hold ;
  if first.z then x_hold=x ;
  if x_hold >=y then do ;
     w=y ;
     x_hold = x_hold-y ;
  end ;
  else do ;
     w=x_hold ;
         x_hold=0 ;
  end ;
  output ;
  if last.z and x_hold > 0 then do ;
            x = . ;
                y = . ;
                w = x_hold ;
                output ;
  end ;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群