楼主: moyunzheng
7606 11

SAS 宏返回值、调用宏的问题 [推广有奖]

  • 1关注
  • 2粉丝

博士生

60%

还不是VIP/贵宾

-

威望
0
论坛币
1357 个
通用积分
4.3535
学术水平
18 点
热心指数
19 点
信用等级
17 点
经验
11986 点
帖子
240
精华
0
在线时间
361 小时
注册时间
2010-12-11
最后登录
2025-12-2

楼主
moyunzheng 发表于 2011-3-24 14:40:54 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
%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
二维码

扫码加我 拉你入群

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

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

关键词:返回值 infile Input Macro Food SAS 嵌套 返回值

回帖推荐

myc_sas 发表于6楼  查看完整内容

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 这样你把两个表合并应该就可以直接作你需要的查询什么的了。

本帖被以下文库推荐

沙发
myc_sas 发表于 2011-3-24 16:14:37
没看明白为什么要用macro,也没看出哪里有嵌套macro……

藤椅
moyunzheng 发表于 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变量表示其单位卡路里。
这样出可以吧?

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

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

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

地板
myc_sas 发表于 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

这样你把两个表合并应该就可以直接作你需要的查询什么的了。
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

7
myc_sas 发表于 2011-3-24 19:05:13
5# moyunzheng

大概明白了,你现在建表的情况是,每个人三天(或者不管几天)内早中晚三餐全部加起来都最多只有10种食物可以选择。

不过这么一来感觉更应该参考我上一楼的建表,只不过需要加上人的id,更为灵活。
那样每个人每天每顿有多少种选择都可以。

8
moyunzheng 发表于 2011-3-24 19:24:23
7# myc_sas 之所以有这么多的变量是因为问卷的表格的格式就是这样的,然后用epidata建库录入,为了方便就没有更改格式。你的意思是要把它变成这样的表吗?
Id  day eat foodid calorie
01 1 1 11 123
01 1 1 23 245
01 1 1 35 385
01 1 2 39 221
01 1 3 09 215
eat的1,2,3代表早,中,晚餐

9
myc_sas 发表于 2011-3-24 19:38:22
moyunzheng 发表于 2011-3-24 19:24
7# myc_sas 之所以有这么多的变量是因为问卷的表格的格式就是这样的,然后用epidata建库录入,为了方便就没有更改格式。你的意思是要把它变成这样的表吗?
Id  day eat foodid calorie
01 1 1 11 123
01 1 1 23 245
01 1 1 35 385
01 1 2 39 221
01 1 3 09 215
eat的1,2,3代表早,中,晚餐
嗯,最终结果差不多就是这个意思:

ID day eat food_id gram calo_per_gram calorie
01  1     1     11        50            2.4               120
01  1     1     23        25            1.1               26.5

等等

10
moyunzheng 发表于 2011-3-24 20:31:36
9# myc_sas 将一个观测变成多个观测,用什么procedure?

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-25 00:58