a******n 发帖数: 11246 | 1 我现在有个表格,其中一列是数字表达式:
Column A
1+1
1+2
1+3
etc...
这些数字表达式都以string的方式存储。
现在想把这些表达式的值算出来,存到新的列里,像这样:
Column A Column B
1+1 2
1+2 3
1+3 4
etc.. etc...
请教怎么做?感觉应该不难但是折腾了半天也没好方法。 |
g**u 发帖数: 205 | |
a******n 发帖数: 11246 | 3 朋友直接来段代码吧,我折腾了半天也没好办法。
我先把所有N个表达式写进N个macro variables,
然后把值算出来放在另外个表里,再把两个表合并起来。
像傻x似的,唉。
【在 g**u 的大作中提到】 : SAS/IML?
|
g**u 发帖数: 205 | 4 我也不会用,还在学,只是觉得可能IML能解决你的问题
【在 a******n 的大作中提到】 : 朋友直接来段代码吧,我折腾了半天也没好办法。 : 我先把所有N个表达式写进N个macro variables, : 然后把值算出来放在另外个表里,再把两个表合并起来。 : 像傻x似的,唉。
|
A*****a 发帖数: 1091 | 5 笨方法,抛砖引玉:
data temp;
input equation $;
cards;
1+1
1+2
1+3
;
run;
%macro calcu;
%let n=1;
%DO %WHILE (&n <=3);
data _NULL_; set temp;
if _N_=&n then call symput('eq',Trim(equation)); run;
data temp;
set temp;
if _N_ =&n then results=&eq;
run;
%let n=%eval(&n+1);
%end;
%mend;
%calcu;
【在 a******n 的大作中提到】 : 朋友直接来段代码吧,我折腾了半天也没好办法。 : 我先把所有N个表达式写进N个macro variables, : 然后把值算出来放在另外个表里,再把两个表合并起来。 : 像傻x似的,唉。
|
d******9 发帖数: 404 | 6 Macro is too complicated, open codes can do it.
data A;
input A $;
cards;
1+1
1+2
1+3
;
run;
data B;
set A;
C=strip(scan(A, 1, '+-/*'));
D=strip(scan(A, 2, '+-/*'));
Y=C + D;
run;
Obs A C D Y
1 1+1 1 1 2
2 1+2 1 2 3
3 1+3 1 3 4 |
A*****a 发帖数: 1091 | 7 万一运算符不全是加号呢?
【在 d******9 的大作中提到】 : Macro is too complicated, open codes can do it. : data A; : input A $; : cards; : 1+1 : 1+2 : 1+3 : ; : run; : data B;
|
s******r 发帖数: 1524 | 8 万一不止一个运算符呢?
【在 A*****a 的大作中提到】 : 万一运算符不全是加号呢?
|
A*****a 发帖数: 1091 | 9 用我的笨办法就没关系
坐等高人来解决
【在 s******r 的大作中提到】 : 万一不止一个运算符呢?
|
o****o 发帖数: 8077 | 10 output to a Text file with
result = &yourformula; output
then %inc "file" in the next data step;
【在 s******r 的大作中提到】 : 万一不止一个运算符呢?
|
|
|
p*******i 发帖数: 1181 | |
k*******a 发帖数: 772 | 12 data temp;
input equation $;
cards;
1+1
1+2
1+3
;
run;
proc sql noprint;
select "B="||equation||";"||"output;" into :eqn separated by " " from temp;
quit;
data temp1;
&eqn
run; |
d********e 发帖数: 9 | 13 data A;
input A $;
cards;
1+1
1+2
1+3
;
run;
data B;
set A;
B = resolve(catt('%eval(',A,')'));
run; |
d******9 发帖数: 404 | 14 Great method!
However, if the calculation contains non-integer, then %eval will fail to
work, we will get missing value for B.
Say,
1.6+ 1.8
1+ 2.3
and so on
【在 d********e 的大作中提到】 : data A; : input A $; : cards; : 1+1 : 1+2 : 1+3 : ; : run; : data B; : set A;
|
A*****a 发帖数: 1091 | 15 试了试,只有这个能算非integer 。 mark 下,学习了!
temp;
【在 k*******a 的大作中提到】 : data temp; : input equation $; : cards; : 1+1 : 1+2 : 1+3 : ; : run; : proc sql noprint; : select "B="||equation||";"||"output;" into :eqn separated by " " from temp;
|
A*****a 发帖数: 1091 | 16 试了下,发现如果非integer ,这个办法会显示有错,连missing value都不会给。
but,对于integer 而言,是最好的办法了吧。mark下,学到新东西啦
【在 d******9 的大作中提到】 : Great method! : However, if the calculation contains non-integer, then %eval will fail to : work, we will get missing value for B. : Say, : 1.6+ 1.8 : 1+ 2.3 : and so on
|
d********e 发帖数: 9 | 17 改成
data B;
set A;
B = resolve(catt('%SYSEVALF(',A,')'));
run;
应该能计算non-integer吧
【在 d******9 的大作中提到】 : Great method! : However, if the calculation contains non-integer, then %eval will fail to : work, we will get missing value for B. : Say, : 1.6+ 1.8 : 1+ 2.3 : and so on
|
d******9 发帖数: 404 | 18 Bingo! It works.
Good job!
【在 d********e 的大作中提到】 : 改成 : data B; : set A; : B = resolve(catt('%SYSEVALF(',A,')')); : run; : 应该能计算non-integer吧
|
d******9 发帖数: 404 | 19 This method has a small problem.
If the data set Temp has millions of obs., then in LOG, we will have
millions of lines for the converted open codes.
Any way, it is a small drawback. Good job!
temp;
【在 k*******a 的大作中提到】 : data temp; : input equation $; : cards; : 1+1 : 1+2 : 1+3 : ; : run; : proc sql noprint; : select "B="||equation||";"||"output;" into :eqn separated by " " from temp;
|
A*****a 发帖数: 1091 | 20 nice and clean.大牛您是怎么学习macro的?太厉害了
【在 d********e 的大作中提到】 : 改成 : data B; : set A; : B = resolve(catt('%SYSEVALF(',A,')')); : run; : 应该能计算non-integer吧
|
|
|
d********e 发帖数: 9 | 21 真心没有系统的学过。我也是刚起步。
就是有时间就折腾自己的程序,看有没有简单快捷的方法。还有就是跟着SAS 论坛上混
,看别人有啥好技巧。
【在 A*****a 的大作中提到】 : nice and clean.大牛您是怎么学习macro的?太厉害了
|
a******n 发帖数: 11246 | 22 多谢楼上各位朋友的回复!
好多写法都是我不熟悉的,学到了很多。让我一个个输入SAS试试看哈~~ |
A*****a 发帖数: 1091 | 23 看来我还没起步。。。您有啥好论坛给推荐推荐不?这里人太少了。。。
【在 d********e 的大作中提到】 : 真心没有系统的学过。我也是刚起步。 : 就是有时间就折腾自己的程序,看有没有简单快捷的方法。还有就是跟着SAS 论坛上混 : ,看别人有啥好技巧。
|
d********e 发帖数: 9 | 24 SASCommunity,人大经济论坛SAS版之类的
【在 A*****a 的大作中提到】 : 看来我还没起步。。。您有啥好论坛给推荐推荐不?这里人太少了。。。
|
A*****a 发帖数: 1091 | 25 thanks a log.好奇一下啊,人大的统计很厉害么?还是你是人大的?
【在 d********e 的大作中提到】 : SASCommunity,人大经济论坛SAS版之类的
|
d********e 发帖数: 9 | 26 不是人大的。也是找了很多SAS论坛,觉得这个论坛比较活跃
【在 A*****a 的大作中提到】 : thanks a log.好奇一下啊,人大的统计很厉害么?还是你是人大的?
|