楼主: Tigflanker
2098 10

[问答] 求解一个宏问题,应该不难,但是找不到问题 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

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

楼主
Tigflanker 发表于 2013-3-24 13:54:38 |AI写论文
50论坛币
程序如下:
data a;
input va $ @@;
cards;
a 一
;
run;

%macro m(var);
data b;set a;
  %if "va"="一" %then %do;vb=&var;%end;
  %else %do;vb=va;%end;
run;
%mend;

%m(二);


其实就想把一个数据集中某变量中符合条件的观测换掉(换成宏参数的内容)可是失败了。

求帮助,谢谢。

最佳答案

Eternal0601 查看完整内容

data a; input va $ @@; cards; a one ; run; %macro m(var); data b;set a; if va="one" then vb=&var; else vb=va; run; %mend; %m('two');
关键词:Input Macro cards Data else 程序 set
Bye SAS.
若有缘,能重聚。

沙发
Eternal0601 发表于 2013-3-24 13:54:39
Eternal0601 发表于 2013-3-24 14:28
这个应该可以解决你的问题,你的code中用的是%if。。。%then是有问题的,“va”=“一”是false;故就执行 ...
data a;
input va $ @@;
cards;
a one
;
run;

%macro m(var);
data b;set a;
  if va="one" then vb=&var;
  else vb=va;
run;
%mend;

%m('two');
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 80 + 60 + 2 + 1 + 1 热心帮助其他会员

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

藤椅
Tigflanker 发表于 2013-3-24 13:59:46
我明白&var只是一段文本,但是不知道怎么把他转化为字符串,用过 %str 、 %symget 都不行
Bye SAS.
若有缘,能重聚。

板凳
ghbdom 在职认证  发表于 2013-3-24 14:10:30
look

报纸
Eternal0601 发表于 2013-3-24 14:24:52
%macro m1(var);
data b1;set a;
  if va="one" then vb=&var;
  else vb=va;
run;
%mend;

%m1('two');

地板
Eternal0601 发表于 2013-3-24 14:28:19
Eternal0601 发表于 2013-3-24 14:24
%macro m1(var);
data b1;set a;
  if va="one" then vb=&var;
这个应该可以解决你的问题,你的code中用的是%if。。。%then是有问题的,“va”=“一”是false;故就执行%else语句,vb=va,从而使你的code结果只是多产生一个值跟va变量一样的变量b而已

7
Tigflanker 发表于 2013-3-24 15:01:47
Eternal0601 发表于 2013-3-24 14:35
data a;
input va $ @@;
cards;
这样的确可以,不过我有些情况不得不使用%if 和%then
Bye SAS.
若有缘,能重聚。

8
Eternal0601 发表于 2013-3-24 15:15:08
Tigflanker 发表于 2013-3-24 15:01
这样的确可以,不过我有些情况不得不使用%if 和%then
喔,不知是什么情况,提问中貌似没有提出来

9
bobguy 发表于 2013-3-24 21:47:22
  %if "va"="一" %then %do;vb=&var;%end;  is never true because "va" is not NEVER equal to "一".

The macro will always return >vb=va;<.   I don't think that is what you want.



%macro m(var);

  %if "va"="一" %then %do;vb=&var;%end;
  %else %do;vb=va;%end;

%mend;

%put ">>>>%m(二)<<<<";
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 3Q, problem have been solved.

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

10
Aharach 发表于 2013-3-24 23:17:35
Try this:
  1. %macro m(var);
  2. data b;set a;
  3.   %if "va"="一" %then %do;vb="&var";%end;
  4.   %else %do;vb=va;%end;
  5. run;
  6. %mend;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 3Q, problem have been solved.

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

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

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