经管之家App
让优质教育人人可得
立即打开
全部版块
我的主页
›
论坛
›
数据科学与人工智能
›
数据分析与数据科学
›
SAS专版
求解call symput 应用
楼主
revelc
10842
20
收藏
2010-12-26
悬赏
15
个论坛币
已解决
call symputx 似乎只能提取data步的最后一行某变量的值,有没有办法让他对每一行的某变量的值进行提取,比如说如何实现如下代码:
data b;
set a;
call symputx("d1",trim(d1));
call symputx("d2",trim(d2));
variance=std(of &d1-&d2);
run;
如何让call symputx在每一行都停留并提取改行变量d1和d2的值?请各位指点迷津啊!
顺带弱问一句,宏变量的值能不能随表中某变量的值变化呢?
最佳答案
soporaeternus
查看完整内容
我不会写of var list里的数组,只能这样了,希望高手指教,这个效率要高于昨天晚上那个,呵呵
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
全部回复
沙发
soporaeternus
2010-12-26 20:21:35
复制代码
我不会写of var list里的数组,只能这样了,希望高手指教,这个效率要高于昨天晚上那个,呵呵
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
藤椅
soporaeternus
2010-12-26 21:50:20
论坛里有位前辈说过,如果用到宏变量需要按行即时更新取值,那么就需要考虑这个宏变量使用的必要性。(大致意思)
我想这可以解决楼主的困惑。
楼主列举代码可能会由于宏变量需要首先compile而报错(&d1 &d2之前不存在而由该步建立)。
call symputx可以在dataset的任何一行,多行赋任意变量的值给宏变量,就是增加对于行数或者是对应变量取值的限制。例如if _n_=10 then call symputx(......);或者是if gender='M' then call symputx(......);
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
板凳
revelc
2010-12-27 11:09:26
2#
soporaeternus
多谢楼上的回答。难道说要让macro的值是变化这种想法是不可取的?call symput 直接加条件限制也没效果。看来还得继续加深学习了。
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
报纸
baoaibaobao
2010-12-27 14:03:44
还是没明白应该如何解决!!
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
地板
elek.me
2010-12-27 20:50:24
楼主的想法,可以实现,不过如果对每一行某变量来赋值给宏变量的话,那么肯定是要生成多个宏变量了,如:
复制代码
这段程序是把sashelp.class里的weight值赋值给宏变量weight_1 weight_2 .... 等等。 1 2 对应的是观测的行数。
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
点击查看更多内容…
7楼
elek.me
2010-12-27 20:51:52
上面是取一个变量值的方法,楼主也可以按照上面的方法尝试一下多个变量的值。 也是可以的。
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
8楼
baoaibaobao
2010-12-28 09:07:04
再请教一下楼上,那要用的时候该怎么用呢?&weight_1,&weight_2..........??
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
9楼
soporaeternus
2010-12-28 11:16:37
我觉得楼主的想法不需要宏就可以实现,直接在data步里用变量来做就可以了
宏变量只是文本替换,和真正意义上的变量是有区别的
SAS执行含有宏的语句的时候是先解析出文本内容,再执行的
所以在一个data步里完成宏的赋值和执行是几乎不可能的,使用call execute之类不算......
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
10楼
revelc
2010-12-28 11:18:41
5#
elek.me
多谢解答!尝试了一下,这样的话调用这些宏需要生成N个不同的data步才能实现我的目的。似乎还是不能在单个data步内逐行调用。不知有没有更高效的法子?也许对SAS是苛刻了?
楼上: 可以在%do i = 1 %to &N下用&&weight_&i来调用。
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
11楼
revelc
2010-12-28 11:24:55
8#
soporaeternus
谢谢你!如果需要利用的变量每一行都一样就好办了,我这个计算需要每行用到的变量都不同,所以。。。
确实,如果在data步内部用宏的话,解析后只对最后一行或者指定的某行执行一次。请问你提到的call execute 是列外是怎么一回事呢?
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
12楼
soporaeternus
2010-12-28 11:46:28
call execute可以编辑SAS代码本身,并且在data步结束后执行
如果每一行的运算变量的规则可以表格化,那么利用array,或者是call execute可以实现你的需求......
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
13楼
elek.me
2010-12-28 16:01:03
9#
revelc
要用这种方法的话,一般是生成很多个宏变量,然后再另外的data或者proc步里来调用。
生成多个宏变量,可以通过array和call symput来结合使用。
楼主,你最好举个具体的例子。
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
14楼
revelc
2010-12-28 17:57:58
12#
elek.me
id
v1
v2
v3
v4
v5
d1
d2
var
1
1
2
3
4
5
v2
v4
2
4
3
2
1
5
v1
v4
3
2
5
1
4
3
v1
v3
4
3
1
4
2
5
v2
v5
谢谢你的回复啊,具体的例子大概如上表: 目标是计算方差var,第一行var=std(of v2-v4),第二行var=std(of v1-v4)...。
我试了下用array放在std里,似乎不认。。。
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
15楼
soporaeternus
2010-12-28 22:37:58
复制代码
权当抛砖引玉......
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
16楼
baoaibaobao
2010-12-29 08:41:45
学习了
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
17楼
revelc
2010-12-29 11:01:39
多谢soporaeternus和各位高手的指点和讨论!拜读两页code中...
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
18楼
Isscaliu
2010-12-29 16:11:39
用proc sql 的select into创建macro variables 然后跑loop行么??
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
19楼
revelc
2011-1-2 10:56:47
18#
Isscaliu
也行 但是不知道哪个效率更高点
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
20楼
Isscaliu
2011-1-2 19:31:53
讲到效率那就要看你的data set是在server里运行还是local运行。还有你的application是什么。当然如果是直接从数据库里边调用data table的话,data step可能没有那么高效率!但是如果从programming效率来讲,你的这个application用call execute可能比较高效(这里用上“可能”,因为俺以前没有接触过call execute,所以没有什么资格直接评论)。但是俺工作现在的application用select into就显得比较有效率。(有一大的data set A,约超过5百万个数据。另一小的data set B,包含reprot 名称和相应的selection criteria。用B的每一行数据在A里边寻找对应数据并产生report。所以在这里我想到的只能用proc sql select into来完成。如有更加高效的方法,请大家指教指教)
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
21楼
soporaeternus
2011-1-2 21:26:42
20#
Isscaliu
call execute本身很难衡量其效率如何,而取决于其解析出的代码的效率。
楼主的意思可能是针对每一行数据有不同的变换逻辑,相应参数也在每行对应的位置上。
可以实现的办法有很多,如果可以将始末参数写在聚合函数的of list里,我认为是最简捷和高效的办法。
由于我不会这种方法,现在的办法是对于每行数据做2次循环计算,一次计算均值,第二次计算标准差。效率就低了很多......
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
相关推荐
请教关于call symput的使用原理
请问CALL SYMPUT为什么不能在%do里面使用?谢谢!
call symput 读取数据的问题
call symput 多次使用问题
call symput的问题
SAS中的call symput和call symputx的区别是什么?
请问这里的call symput为什么不能生成宏?
call symput的使用方法?
call symput出错
关于call symput的使用方式
栏目导航
SAS专版
stata专版
行业分析报告
经管文库
文献求助专区
数据交流中心
热门文章
CDA 认证考试大纲 2025 重磅更新:一二级考 ...
CDA数据分析师实战:因子分析的业务应用与落 ...
Gemini准确率从21%飙到97%!谷歌只用了这一 ...
Introductory Econometrics: A Modern Appr ...
如盈财女:1.19黄金回踩顺势做多,原油高空 ...
CDA数据分析脱产就业班于2025年12月08日开班 ...
图书:历史照进现实
optimization algorithms: ai techniques f ...
兴业研究-库存周期分析
【资料共享】Python入门资料与产品经理学习 ...
推荐文章
【必看】【本版版规,欢迎发悬赏贴求助】
26年寒假天津站|Gemini论文写作&数据分析 ...
2026JG学术冬训营:从Stata初高到Python机器 ...
关于如何利用文献的若干建议
关于学术研究和论文发表的一些建议
关于科研中如何学习基础知识的一些建议 (一 ...
一个自编的经济学建模小案例 --写给授课本科 ...
AI智能体赋能教学改革: 全国AI教育教学应用 ...
2025中国AIoT产业全景图谱报告-406页
关于文献求助的一些建议
说点什么
分享
微信
QQ空间
QQ
微博
扫码加好友,拉您进群
各岗位、行业、专业交流群