经管之家App
让优质教育人人可得
立即打开
全部版块
我的主页
›
论坛
›
数据科学与人工智能
›
数据分析与数据科学
›
SAS专版
求解call symput 应用
楼主
revelc
10631
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专版
商学院
休闲灌水
真实世界经济学(含财经时事)
经管在职博
经管文库(原现金交易版)
热门文章
2026“课题申报”抢跑号角的已吹响!国社科 ...
Nature点赞!哈佛MIT最新作:AI科学家时代来 ...
CDA 认证考试大纲 2025 重磅更新:一二级考 ...
达富发投资关于中百集团行情数据操作分析与 ...
GTAP11运行扩展数据库出错,希望高手指点。
2025秋季大摩宏观团队闭门会议纪要
英文书籍
建筑的想象之整理补充笔记
英文书籍
超越普里瓦洛夫无穷乘积与它对解析函数的应 ...
推荐文章
10月重磅来袭|《打造Coze/Dify专属学术智能 ...
高校老师和学生都在偷偷上的智能体课,到底 ...
最快1年拿证,学费不足5W!热门美国人工智能 ...
关于如何利用文献的若干建议
关于学术研究和论文发表的一些建议
关于科研中如何学习基础知识的一些建议 (一 ...
一个自编的经济学建模小案例 --写给授课本科 ...
AI智能体赋能教学改革: 全国AI教育教学应用 ...
2025中国AIoT产业全景图谱报告-406页
关于文献求助的一些建议
说点什么
分享
微信
QQ空间
QQ
微博
扫码加好友,拉您进群
各岗位、行业、专业交流群