楼主: lihanfeng371
6256 24

[问答] 求助:简单的程序,不报错,但是没有结果……(已解决,感谢高手的简洁代码) [推广有奖]

  • 0关注
  • 0粉丝

本科生

28%

还不是VIP/贵宾

-

威望
0
论坛币
37 个
通用积分
0
学术水平
0 点
热心指数
3 点
信用等级
0 点
经验
3126 点
帖子
84
精华
0
在线时间
76 小时
注册时间
2010-9-6
最后登录
2019-5-2

楼主
lihanfeng371 发表于 2011-1-6 14:00:45 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
求教:我想把一个8字符的变量,截取成8个变量,新的变量分别对应原变量的一个位数的值,我写的程序如下,但是出不来……
data li;
input tim $8.;
cards;
01001010
10100101
01100110
;
run;
data li2;
  set li;
  %let i=1;
  k=length(tim);
  do while(&i. le k);
    tim&i=substr(tim,&i.,1);
%let i=%eval(&i+1);
  end;
run;

第一个小程序是新弄一个小数据作试验用。第二个程序也不报错,就是不停的运行,感觉好像是死循环了……
二维码

扫码加我 拉你入群

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

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

关键词:已解决 SUBSTR length cards Input 求助 程序 结果

回帖推荐

soporaeternus 发表于8楼  查看完整内容

感觉上可以一个data步搞定...... 呵呵

本帖被以下文库推荐

沙发
soporaeternus 发表于 2011-1-6 14:05:24
不用宏,都用data步的语句就可以了
否则2恒小于8,貌似就死循环了
一个小例子,可以说明点宏的运行机制
  1. data _null_;
  2.         x=&x;
  3.         %let x=1;
  4.         put x=;
  5.         %let x=%eval(&x+1);
  6. run;
复制代码
Let them be hard, but never unjust

藤椅
lihanfeng371 发表于 2011-1-6 14:07:44
如果不用宏的话,那么如何对变量进行命名呢?

板凳
lihanfeng371 发表于 2011-1-6 14:10:54
请求帮忙改下程序,谢谢:)

报纸
baoaibaobao 发表于 2011-1-6 14:43:12
  1. data li;
  2. input tim $8.;
  3. cards;
  4. 01001010
  5. 10100101
  6. 01100110
  7. ;


  8. data li;
  9.         set li;
  10.         call symput('tim',length(tim));
  11. run;
  12. %macro li;
  13.         data li2;
  14.         set li;
  15.         %do i=1 %to &tim.;  
  16.                 tim&i.=substr(tim,&i.,1);               
  17.         %end;
  18.         output;
  19.         run;
  20. %mend;
  21. %li;
复制代码

地板
soporaeternus 发表于 2011-1-6 14:47:44
楼上确定&tim可以被解析出来?
Let them be hard, but never unjust

7
lihanfeng371 发表于 2011-1-6 14:50:25
baoaibaobao,代码会报错如下:

WARNING: 没有解析符号引用 TIM。
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &tim.
ERROR: %TO 值(%DO I 循环中)无效。
ERROR: 宏 LI 将终止执行。

8
soporaeternus 发表于 2011-1-6 14:53:32
  1. data li;
  2. input tim $8.;
  3. if _N_=1 then do;
  4.         call symputx("n",length(tim));
  5. end;
  6. cards;
  7. 01001010
  8. 10100101
  9. 01100110
  10. ;
  11. run;
  12. data li2;
  13.         set li;
  14.         array tim_arr tim1-tim&n.;
  15.         do i=1 to &n by 1;
  16.                 tim_arr[i]=substr(tim,i,1);
  17.         end;
  18.         drop i;
  19. run;
复制代码
感觉上可以一个data步搞定......
呵呵
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
醉_清风 + 1 + 1 + 1 数组确实是好东西啊~

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

Let them be hard, but never unjust

9
baoaibaobao 发表于 2011-1-6 14:58:13
7# lihanfeng371 我修改了,不过还是没有soporaeternus简洁啊

10
lihanfeng371 发表于 2011-1-6 15:04:47
tim                  tim1    tim2  tim3 tim4 …… tim8
01001010           0          1       0       0   ……    0
10100101           1          0       1       0   ……    1
01100110           0          1       1       0   ……    0   

我想要的结果是上面这样子的,soporaeternus 写的代码跑出来好像不是这个结果的样子…………
还是先谢谢soporaternus了:)

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

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