楼主: wlfjhh
1449 8

求助一个简单的code [推广有奖]

  • 0关注
  • 0粉丝

博士生

11%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
4.5000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
367 点
帖子
61
精华
0
在线时间
372 小时
注册时间
2010-6-12
最后登录
2024-3-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
数据样式如下:
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


二维码

扫码加我 拉你入群

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

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

关键词:code COD ODE 再分配

回帖推荐

yingzi2003 发表于9楼  查看完整内容

这里用了两次OUTPUT, 第一个OUTPUT已经输出了全部的数据. 第二个OUTPUT 再输出一次满足条件的记录.
沙发
陶陶小秋 发表于 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;

水平有限,用了很笨的方法,坐等大牛指教。
已有 1 人评分论坛币 收起 理由
admin_kefu + 15 热心帮助其他会员

总评分: 论坛币 + 15   查看全部评分

使用道具

藤椅
wlfjhh 发表于 2016-4-6 09:37:05 来自手机 |只看作者 |坛友微信交流群
比我的方法简便了很多。

使用道具

板凳
67890 发表于 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;
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

使用道具

报纸
wlfjhh 发表于 2016-4-6 20:07:52 来自手机 |只看作者 |坛友微信交流群
67890 发表于 2016-4-6 10:38
data aa;
input z $ x y;
cards;
似乎运行出来的结果和想要的 有点不一样。不过还是非常感谢

使用道具

地板
yingzi2003 发表于 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;
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
admin_kefu + 30 + 1 + 2 热心帮助其他会员

总评分: 论坛币 + 30  学术水平 + 1  热心指数 + 2   查看全部评分

使用道具

7
wlfjhh 发表于 2016-4-6 23:05:48 来自手机 |只看作者 |坛友微信交流群
yingzi2003 发表于 2016-4-6 22:01
proc sort data = orig ;
  by z ;
run ;
膜拜。 膜拜。一个data步搞定。多向你学习

使用道具

8
wlfjhh 发表于 2016-4-6 23:17:26 |只看作者 |坛友微信交流群
yingzi2003 发表于 2016-4-6 22:01
proc sort data = orig ;
  by z ;
run ;
能多请教一个问题吗
  if last.z and x_hold > 0 then do ;
             x = . ;
                 y = . ;
                 w = x_hold ;
                 output ;
   end ;
为什么这个语句就可以多增加一行,而不是把最后一行的X和Y变成缺失值呢,,好神奇呀

使用道具

9
yingzi2003 发表于 2016-4-6 23:28:19 |只看作者 |坛友微信交流群
这里用了两次OUTPUT, 第一个OUTPUT已经输出了全部的数据. 第二个OUTPUT 再输出一次满足条件的记录.
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
wlfjhh + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 06:48