全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3883 9
2015-10-28
楼主有个经过若干步骤后生成的数据集,对于数据中的若干列由于其小数位数非常多,需要进行四舍五入保留2位小数。
现在的问题是,每次生成的数据集变量会有不同,现在假设只需要处理第2个至最后一个变量。

/*首先生成一个简化的数据集test*/
data test;
input Item $ A B C;
cards;
Apple 1.234 2.345 3.456
Orange 4.322 6.2345 0.983
Peach 10.682 2.426 7.977
;
run;

/*这里给宏变量赋值,在实际中,这些宏变量是在前几步中赋值的,这里简化处理手工赋值*/
%let numcol = 4;
%let numobs = 3;
%let col2 = A;
%let col3 = B;
%let col4 = C;

/*下面是楼主编的代码,用来对第2到最后一个变量的值四舍五入到0.01*/
%macro roundoff;
%do n = 2 %to &numcol;
        data roundoff;
                set test;
                &&col&n = %sysfunc(round(&&col&n,0.01));
        run;
%end;
%mend;
%roundoff


执行的结果总是报错,ERROR: %SYSFUNC 或 %QSYSFUNC 宏函数引用的函数 ROUND 中的参数 1 不是数字。
这个问题该如何解决?
十分感谢!!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-10-28 21:52:01
data test;
input Item $ A B C;
cards;
Apple 1.234 2.345 3.456
Orange 4.322 6.2345 0.983
Peach 10.682 2.426 7.977
; run;

data test2;
    set test;
    array abc _numeric_;
    do over abc;
      abc = round(abc, 0.01);
    end;
run;

MP754.JPG
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-10-29 05:58:24
试了一下,应该这样
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-10-29 09:12:43
你可以用dictionary去把这个数据集里第二个至最后一个,并且全部是数值型的变量名抓成一个宏变量

再用一个data步数组循环一下
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-10-29 10:21:31
Do you have to do rounding? How about add a format statement at the end of the data step? E.g., format a b c 8.2;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-10-29 15:08:47
yongyitian 发表于 2015-10-28 21:52
data test;
input Item $ A B C;
cards;
这个办法简洁好用,学习了do over的用法,十分感谢!!
不过也有个缺陷,就是不能选择性的对变量进行四舍五入。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群