全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
7607 11
2011-03-24
%macro kfood;
data work.calorie;
infile...;
input id foodname $ calorie;
run;

求定义宏代码(输入食物id获取卡路里)

data work.kfood;
infile ...;
input...;
     ......;
求调用宏获取卡路里并计算每餐总卡路里和食物种类的代码;

run;
%mend kfood;
%kfood

请问,以上的想法是否可行?
代码应该如何编写?

work.kfood的每个观测的变量有
食物种类 M1-M10 (取值为1-40)
第一天对应的早餐食用克数 A1-A10
第一天对应的午餐食用克数 B1-B10
第一天对应的晚餐食用克数 C1-C10
..........
第三天对应的午餐食用克数 H1-H10
第三天对应的晚餐食用克数 I1-I10
说明,很多食用克数是缺失的。

work.calorie的每个观测的变量有
食物种类 id (取值为1-40) 与work.kfood的变量M1-M10对应.
食物名称 foodname
食物每克卡路里  calorie
二维码

扫码加我 拉你入群

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

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

全部回复
2011-3-24 16:14:37
没看明白为什么要用macro,也没看出哪里有嵌套macro……
二维码

扫码加我 拉你入群

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

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

2011-3-24 18:26:28
2# myc_sas 哦,不是嵌套,刚刚学macro不太懂得。
那就问调用的问题吧
我想用宏来减少代码的书写,因为食物种类有40种。要计算每种食物的卡路里的话,食物每克卡路里含量的数据在第二张表里面,第一张表没有。那样的话岂不是要写39个if then 语句来取得某种食物的单位卡路里含量?
所以就想用宏来实现,例如第一个食物M1=10时,将10作为参数调用宏,返回这个食物的单位卡路里,就可以计算出a1,b1--h1,i1的卡路里了。同样算完M2--M10,然后a1---a10相加就是每餐的卡路里。
这样好像每个观测都要调用10次,效率可能不高吧?只不过是想问一下这样能够实现不?

也许另外一种方法会比较好。
分别排序M1-M10后合并两个表,对应每个M1-M10都要一个kal1-kal10变量表示其单位卡路里。
这样出可以吧?
二维码

扫码加我 拉你入群

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

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

2011-3-24 18:44:58
感觉上直接把两个表信息合并一下就可以了么,并不需要用macro什么的。

另外,一共有40种食物的话,第一个表直接列 食物,第一天早餐,第一天中餐,第一天晚餐……不就好了么,为什么要重复10列呢
二维码

扫码加我 拉你入群

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

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

2011-3-24 18:53:29
4# myc_sas 是因为每一餐的食物最多有十种,而每个人的每餐的种类不是相同的,所以得重复十次。这样a1*cal1+a2*cal2+...+a10*cal10才是第一天早餐的卡路里。因为每个观测的m1-m10都不一样,cal1-cal10也是不一样的。
二维码

扫码加我 拉你入群

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

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

2011-3-24 18:54:50
4# myc_sas

再补充一下:

如果我的理解正确,

work.calorie里面有三个变量:id, name, calorie

work.food里有好几十个变量:m1-m10, a1-a10, b1-b10....

如果可能,我建议work.food的结构改为:
food(id或者name都可以,根据你的raw data内容), day(第几天), meal_id(比如1,2,3分别代表早中晚餐) ,gram

这样你把两个表合并应该就可以直接作你需要的查询什么的了。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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