楼主: november
3487 9

[问答] 【悬赏5个论坛币】如何将数据集里多个变量值进行四舍五入处理 [推广有奖]

  • 2关注
  • 1粉丝

本科生

86%

还不是VIP/贵宾

-

威望
0
论坛币
1422 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
1 点
经验
2231 点
帖子
111
精华
0
在线时间
86 小时
注册时间
2005-6-17
最后登录
2021-12-20

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
楼主有个经过若干步骤后生成的数据集,对于数据中的若干列由于其小数位数非常多,需要进行四舍五入保留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 不是数字。
这个问题该如何解决?
十分感谢!!

二维码

扫码加我 拉你入群

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

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

关键词:5个论坛币 四舍五入 多个变量 数据集 变量值 Apple 如何 手工

回帖推荐

teqel 发表于3楼  查看完整内容

试了一下,应该这样

yongyitian 发表于2楼  查看完整内容

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;
沙发
yongyitian 发表于 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
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
november + 5 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

藤椅
teqel 发表于 2015-10-29 05:58:24 |只看作者 |坛友微信交流群
试了一下,应该这样
  1. %macro roundoff;
  2.          data roundoff;
  3.                  set test;
  4.                                         %do n = 2 %to &numcol;
  5.                                  &&col&n = (round(&&col&n,0.01));
  6.                                         %end;
  7.          run;
  8. %mend;
  9. %roundoff
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
november + 5 + 1 + 1 精彩帖子
yongyitian + 2 + 2 + 2 Good Macro. Remove ()?

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

使用道具

板凳
Tigflanker 发表于 2015-10-29 09:12:43 |只看作者 |坛友微信交流群
你可以用dictionary去把这个数据集里第二个至最后一个,并且全部是数值型的变量名抓成一个宏变量

再用一个data步数组循环一下
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
november + 1 + 1 热心帮助其他会员
yongyitian + 2 + 2 + 2 好的意见建议

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

使用道具

报纸
johnpark1 发表于 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;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
november + 1 + 1 观点有启发
yongyitian + 2 + 2 + 2 好的意见建议

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

使用道具

地板
november 发表于 2015-10-29 15:08:47 |只看作者 |坛友微信交流群
yongyitian 发表于 2015-10-28 21:52
data test;
input Item $ A B C;
cards;
这个办法简洁好用,学习了do over的用法,十分感谢!!
不过也有个缺陷,就是不能选择性的对变量进行四舍五入。

使用道具

7
november 发表于 2015-10-29 15:10:17 |只看作者 |坛友微信交流群
teqel 发表于 2015-10-29 05:58
试了一下,应该这样
看了这个知道我哪里有问题了,实测可用,谢谢!!

使用道具

8
november 发表于 2015-10-29 15:12:34 |只看作者 |坛友微信交流群
Tigflanker 发表于 2015-10-29 09:12
你可以用dictionary去把这个数据集里第二个至最后一个,并且全部是数值型的变量名抓成一个宏变量

再用一 ...
其实实际中也是从dictionary获取变量名赋值给宏变量的,不过问题是宏循环的时候编码有问题。
谢谢啦!

使用道具

9
november 发表于 2015-10-29 15:16:02 |只看作者 |坛友微信交流群
johnpark1 发表于 2015-10-29 10:21
Do you have to do rounding? How about add a format statement at the end of the data step? E.g., form ...
是的。之前发过一个帖子,因为要小数位数很多,sas会自动截掉后面几位,这样在用宏变量设定区间的时候总是会出错。
不过您说的这个方法也挺有启发的,谢谢!

使用道具

10
cossinx 发表于 2016-4-4 15:17:55 |只看作者 |坛友微信交流群
5个论坛币)

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 12:56