楼主: priss111
2105 5

请问如何简化以下code中的do循环累加语句?谢谢! [推广有奖]

  • 0关注
  • 5粉丝

副教授

15%

还不是VIP/贵宾

-

威望
0
论坛币
153 个
通用积分
47.5396
学术水平
11 点
热心指数
14 点
信用等级
10 点
经验
14938 点
帖子
473
精华
0
在线时间
805 小时
注册时间
2008-3-30
最后登录
2024-4-12

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问如何简化以下code中的do循环累加语句(红色的code)?谢谢!

说明:该段code运行结果正确.


data gcb2;
    set gcb1;

    array food(9) food1-food9;
    do i = 1 to 9;
        *kindexc()是用于识别单个汉字的,
         而indexc()是用于识别单个字节的(当用indexc()识别汉字时会生成错误的分类结果但log不会报错);
        if kindexc(food(i),"菜","瓜","竹","柿","葱","蒜","卜","椒","冬","姜")  then food(i)="蔬菜";
        else if kindexc(food(i),"肉","骨","脚","腿","翅","鱼","尖")  then food(i)="禽畜肉";
        else if kindexc(food(i),"面","米","粉","包") then food(i)="粮谷类";
        else if kindexc(food(i),"蛋")  then food(i)="鸡蛋";
        else if kindexc(food(i),"奶")  then food(i)="牛奶";
        else if kindexc(food(i),"油")  then food(i)="植物油";
        else if indexc(food(i),"盐")  then food(i)="盐";
        else if indexc(food(i),"抽") then food(i)="生抽";
    end;

   array effective(9) effective1-effective9;
   do i = 1 to 9;
   do j = 1 to 9;
       if  kindexc(food(i),"黄","大")  then  effective(j)=effective(j)*4;
   end;
   end;

   do i = 1 to 9;
    if kindexc(food(i),"黄","大","水","豆")  then food(i)="豆腐";
   end;

   *ef= expected food,ef1-ef7依次为粮谷类、蔬菜、禽畜肉、鸡蛋、豆腐、牛奶、植物油,单位为“斤”;
           ef1 = (n1*330 + n2*375 + n3*475)/500;
        ef2 = (n1*450 + n2*475 + n3*500)/500;
         ef3 = (n1*60 + n2*75 + n3*125)/500;
        ef4 = (n1*1 + n2*1.5 + n3*1.5)*60/500;
        ef5 = (n1*150 + n2*200 + n3*200)/500;
         ef6 = (n1*150 + n2*150 + n3*150)/500;
        ef7 = (n1*25 + n2*25 + n3*25)/500;
   
    *af= actual food,af1-af9依次为粮谷类、蔬菜、禽畜肉、鸡蛋、豆腐、牛奶、植物油、盐、生抽,单位为“斤”;
    do i = 1 to 9;
        if food(i)="粮谷类" then do;
            af1=0;
            af1+effective(i);
     end;
    end;

    do i = 1 to 9;
        if food(i)="蔬菜" then do;
            af2=0;
            af2+effective(i);
    end;
    end;

    do i = 1 to 9;
        if food(i)="禽畜肉" then do;
            af3=0;
            af3+effective(i);
    end;
    end;

    do i = 1 to 9;
        if food(i)="鸡蛋" then do;
            af4=0;
            af4+effective(i);
     end;
    end;

    do i = 1 to 9;
        if food(i)="豆腐" then do;
            af5=0;
            af5+effective(i);
    end;
    end;

    do i = 1 to 9;
        if food(i)="牛奶" then do;
            af6=0;
            af6+effective(i);
    end;
    end;


    do i = 1 to 9;
        if food(i)="植物油" then do;
            af7=0;
            af7+effective(i);
     end;
    end;

    do i = 1 to 9;
        if food(i)="盐" then do;
            af8=0;
            af8+effective(i);
    end;
    end;

    do i = 1 to 9;
        if food(i)="生抽" then do;
            af9=0;
            af9+effective(i);
    end;
    end;


    run;



二维码

扫码加我 拉你入群

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

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

关键词:do循环 code COD ODE Effective 汉字 如何 蔬菜

沙发
learsaas 发表于 2016-10-31 15:03:10 |只看作者 |坛友微信交流群
macro 完成

使用道具

藤椅
priss111 发表于 2016-10-31 15:14:56 |只看作者 |坛友微信交流群
learsaas 发表于 2016-10-31 15:03
macro 完成
谢谢!

请问具体是?

使用道具

板凳
wang1839 在职认证  发表于 2016-11-1 11:47:18 |只看作者 |坛友微信交流群
代码写的太繁杂,应该吧FOOD1-FOOD9TANSPOSE后然后SUM,这样比较简单

使用道具

报纸
priss111 发表于 2016-11-1 12:19:17 |只看作者 |坛友微信交流群
wang1839 发表于 2016-11-1 11:47
代码写的太繁杂,应该吧FOOD1-FOOD9TANSPOSE后然后SUM,这样比较简单
所以想简化,
但取值有太乱。

food1-foo9中的取值是交叉的:food1-food9的取值均是9种中的任何一种,
transpose之后sum仍然是乱的;
目的是:food1-food9中的取值相同的食物的重量(effective1-effective)sum,
只有这样才能知道每一个取值食物的重量。

使用道具

地板
wang1839 在职认证  发表于 2016-11-1 15:31:50 |只看作者 |坛友微信交流群
你先TRANSPOSE 生成两列 一列_NAME_,一列COL1,然后根据COL1值生成你上面那九类,根据九类SORT再SUM

使用道具

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

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

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

GMT+8, 2024-4-20 00:17