楼主: Tigflanker
2147 9

[问答] 求助一个问题,关于symput [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.9128
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

楼主
Tigflanker 发表于 2012-11-16 00:27:35 |AI写论文
300论坛币
遇到一个很苦闷的问题,想了一个下午,请老师们帮帮我,谢谢;

现有结构如下:

%macro main;

...

data _null_;
set def;  //def数据集见下文
call symput(?,?);  //困难所在
run;

%mend;

问题描述:
1.我想针对数据集def中的每一个变量,对相应P值做一个判断,利用symput函数向data外,%main内抛出十个宏变量,例如&pv1 ... &pv10
2.如果P值小于0.05,则该宏变量累加1,例如,这次循环&pv1为1,&pv10为0(例如下次循环&pv1为2)
0.还有一点:我估计在data步外面套一个%do循环应该可以解决问题,但是这样做会效率很低,特别想数据集生成一次就得到10个宏变量,不然以后加上百上千次模拟,可能SAS吃不消。

老师应该已经看得出来我的意图了,我想模拟数据集算P值比率:检验效能。
求帮助,谢谢,谢谢。

附:def数据集如下:
Variable P-value
v1
0.64
v2 0.08
v3 0.06
v4 0.04
v5 0.01
v6 0.01
v7 0.01
v8 0.01
v9 0.01
v10 0.01



最佳答案

关键词:symput put Variable p-value data步 null
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 12 + 60 + 3 + 2 + 2 鼓励积极发帖讨论

总评分: 经验 + 12  论坛币 + 60  学术水平 + 3  热心指数 + 2  信用等级 + 2   查看全部评分

本帖被以下文库推荐

Bye SAS.
若有缘,能重聚。

沙发
moyunzheng 发表于 2012-11-16 00:27:36
  1. data test;
  2. input Variable $ Pvalue;
  3. cards;
  4. v1   0.64
  5. v2         0.08
  6. v3         0.06
  7. v4         0.04
  8. v5         0.01
  9. v6         0.01
  10. v7         0.01
  11. v8         0.01
  12. v9         0.01
  13. v10         0.01
  14. v1   0.64
  15. v2         0.08
  16. v3         0.06
  17. v4         0.04
  18. v5         0.01
  19. v6         0.01
  20. v7         0.01
  21. v8         0.01
  22. v9         0.01
  23. v10         0.01
  24. ;
  25. run;
  26. proc sort data=test;by variable;run;
  27. data _null;
  28. set test;
  29. retain count;
  30. by variable;
  31. if first.variable then count=0;
  32. if Pvalue<0.05 then count=count+1;
  33. if last.variable then call symput(cats("P_",variable),count);
  34. run;
  35. %put _all_;
复制代码
或者SQL
  1. proc sql noprint;
  2.         create table test2
  3.         as select Variable,sum(case when Pvalue<0.05 then 1 else 0 end) as count
  4.         from test
  5.         group by Variable;
  6. quit;
  7. data _null_;
  8. set test2;
  9. call symput(cats("P_",variable),count);
  10. run;
  11. %put _all_;
复制代码


已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 感谢,提供了两种解决思路。

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
ziyenano 发表于 2012-11-16 09:38:13
是不是这个意思?
data def;
input
Variable $ P_value;
cards;
v1   0.64
v2         0.08
v3         0.06
v4         0.04
v5         0.01
v6         0.01
v7         0.01
v8         0.01
v9         0.01
v10         0.01
;
run;

data _null_;
set def;
call symput('P'||compress(variable),P_value);
run;
%put &Pv1 &Pv2 &Pv3 &Pv4 &Pv5 &Pv6 &Pv7 &Pv8 &Pv9 &Pv10;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 谢谢。

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

板凳
Tigflanker 发表于 2012-11-16 09:57:49 来自手机
ziyenano 发表于 2012-11-16 09:38
是不是这个意思?
data def;
input
ziye老师,你的回复给了我一些提示,谢谢。

不过问题还是没解决,我现在最主要的问题是:通过这一data步后,给这十个宏变量中的某几个自加一。
所以这个data步运行多少次,这其中的宏变量就会依照条件不停自加。
Bye SAS.
若有缘,能重聚。

报纸
pobel 在职认证  发表于 2012-11-16 10:22:17
Tigflanker 发表于 2012-11-16 09:57
ziye老师,你的回复给了我一些提示,谢谢。

不过问题还是没解决,我现在最主要的问题是:通过这一data ...
这个意思?
  1. data def;
  2. input
  3. Variable $ P_value;
  4. cards;
  5. v1   0.64
  6. v2         0.08
  7. v3         0.06
  8. v4         0.04
  9. v5         0.01
  10. v6         0.01
  11. v7         0.01
  12. v8         0.01
  13. v9         0.01
  14. v10         0.01
  15. ;
  16. run;

  17. *** Initialization;
  18. %let pv1=0;
  19. %let pv2=0;
  20. %let pv3=0;
  21. %let pv4=0;
  22. %let pv5=0;
  23. %let pv6=0;
  24. %let pv7=0;
  25. %let pv8=0;
  26. %let pv9=0;
  27. %let pv10=0;

  28. %put &Pv1 &Pv2 &Pv3 &Pv4 &Pv5 &Pv6 &Pv7 &Pv8 &Pv9 &Pv10;

  29. *** First run;
  30. data _null_;
  31. set def;
  32. call symputx('P'||compress(variable),(P_value<0.05)+symget("p"||strip(variable)));
  33. run;
  34. %put &Pv1 &Pv2 &Pv3 &Pv4 &Pv5 &Pv6 &Pv7 &Pv8 &Pv9 &Pv10;

  35. *** Second run;
  36. data _null_;
  37. set def;
  38. call symputx('P'||compress(variable),(P_value<0.05)+symget("p"||strip(variable)));
  39. run;
  40. %put &Pv1 &Pv2 &Pv3 &Pv4 &Pv5 &Pv6 &Pv7 &Pv8 &Pv9 &Pv10;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 感谢!超棒!简洁!!

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

和谐拯救危机

地板
ziyenano 发表于 2012-11-16 10:36:08
这样?
data def;
input
Variable $ P_value;
cards;
v1   0.64
v2         0.08
v3         0.06
v4         0.04
v5         0.01
v6         0.01
v7         0.01
v8         0.01
v9         0.01
v10         0.01
;
run;
/*第一次的时候*/
data _null_;
set def;
if P_value>0.05 then PP=1;
else PP=0;
call symput('P'||compress(variable),PP);
run;
%put &Pv1 &Pv2 &Pv3 &Pv4 &Pv5 &Pv6 &Pv7 &Pv8 &Pv9 &Pv10;
/*不是第一次*/
data _null_;
set def;
if P_value>0.05 then PP=symget('P'||compress(variable))+1;
else PP=symget('P'||compress(variable));
call symput('P'||compress(variable),PP);
run;
%put &Pv1 &Pv2 &Pv3 &Pv4 &Pv5 &Pv6 &Pv7 &Pv8 &Pv9 &Pv10;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 感谢,大概是这个意思。

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

7
bobguy 发表于 2012-11-16 11:36:18
ziyenano 发表于 2012-11-16 09:38
是不是这个意思?
data def;
input
There are a couple of knowledge points here.
1) the call symput is obsolete.  call symputx should be used whenever possible. call symputx converts values automatically.
2) using cat class function to do the concatenation for the same reason.

193  data def;
194  length Variable $8 P_value 8;
195  input
196  Variable  P_value;
197  call symputx( catt('P',Variable), P_value);
198  cards;

NOTE: The data set WORK.DEF has 10 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


209  ;
210
211  %put &Pv1 &Pv2 &Pv3 &Pv4 &Pv5 &Pv6 &Pv7 &Pv8 &Pv9 &Pv10;
0.64 0.08 0.06 0.04 0.01 0.01 0.01 0.01 0.01 0.01
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 Thank you very much, Prof bob.

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

8
ziyenano 发表于 2012-11-16 11:39:37
bobguy 发表于 2012-11-16 11:36
There are a couple of knowledge points here.
1) the call symput is obsolete.  call symputx should ...
thanks  very much~

9
Tigflanker 发表于 2012-11-16 14:43:09 来自手机
ziyenano 发表于 2012-11-16 11:39
thanks  very much~
感谢ziyu老师回答,我晚上上论坛答复你。我用了个笨办法暂时先解决了:用symput弹出十个布尔宏变量,然后最后用宏do和宏if做的累加。

先谢谢,晚上看。
Bye SAS.
若有缘,能重聚。

10
zkymath 在职认证  发表于 2012-11-16 16:49:22
retain
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 Thanks.

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

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

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