楼主: pinkbiny
5182 16

自动生成变量名 [推广有奖]

  • 0关注
  • 0粉丝

初中生

47%

还不是VIP/贵宾

-

威望
0
论坛币
19 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
130 点
帖子
13
精华
0
在线时间
9 小时
注册时间
2007-12-11
最后登录
2016-10-12

楼主
pinkbiny 发表于 2010-11-8 12:37:53 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现在有一列时序数据n个,我要将每18个观测重新设为另一个变量名,怎么自动生成变量名啊!!!
data e;
set d;
do j=0 to 2;
do i=1 to 18;
  if col0=1990+18*j+i then x(j)=co1;
end;
end;
run;

红色位置要怎么改,用数组好像也不行
二维码

扫码加我 拉你入群

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

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

关键词:生成变量 自动生成 Data Then End

沙发
viterbi 发表于 2010-11-8 13:17:03
数组应该是可以的,或者用宏吧

藤椅
pinkbiny 发表于 2010-11-8 13:22:24
2# viterbi
数组名可以用循环吗?
data e;
set d;
array x(*)
do j=0 to 2;
do i=1 to 18;
  if col0=1990+18*j+i then     x(j) =co1;
end;
end;
by _col0;
run;

我的编程显示是错误的,可是又不知道错在哪

板凳
sopching 发表于 2010-11-8 13:25:57
‘每18个观测重新设为另一个变量名’ 这话什么意思??

报纸
pinkbiny 发表于 2010-11-8 13:29:07
4# sopching
就是时序X,我要把x中每18个观测放到变量x1,x2,……

地板
jlw101065 发表于 2010-11-8 13:37:22
你这句 if col0=1990+18*j+i then x(j)=co1;
col0和后面的co1是你已知的变量吗?

7
pinkbiny 发表于 2010-11-8 14:16:18
6# jlw101065
对的

8
liudeng2005 发表于 2010-11-8 14:20:12
粗俗的理解了一下楼主的意思,楼主的数据应该是这样的
col0      col1
1990      xx
1991      xx
。。。。。。
2008      xx

要转换成
col0      array1      array2      array3
1990      xxx             .
。。。 xxx              .
2008      xxx              .
2009       .                xxx
。。。    .                xxx  
如果是这样的话,那这个数据步可以这样写
data e;
set d;
array x(3);
do j=0 to 2;
do i=1 to 18;
  if col0=1990+18*j+i  then do;x(j)=col1;output;end;
end;
end;
run;

感觉这个方法不是最好,应该有更好的方法(使用了mod函数,未测试不知道对不对)
data e;
set d;
array x(*);
x(mod(col0-1990,18))=col1;
run;
我就是我@!

9
pinkbiny 发表于 2010-11-8 16:23:52
8# liudeng2005
我没说清楚,我要的数据是这样的
                   x1    x2      x3
A    1991      xxx  xxx  xxx      
A    1992         
……
A    2008
B   1991
B   1992
……
B    2008
按你的命令,结果是错开的
                         x1       x2     x3
A    1991          xxx
A    1992         xxx
……     
A    1991                     xxx
……
A    1991                              xxx

有什么方法可以克服吗

10
sopching 发表于 2010-11-8 16:27:25
如果是这个意思,那么你的代码稍加改动就可以了。
  1. data e;
  2.   set d;
  3.   array x(3);
  4.     do j=1 to 3;/*这里做了修改,数组是不认X(0)的*/
  5.        do i=1 to 18;
  6.           if col0=1972+18*j+i  then do;
  7.           x(j)=col1;
  8.           output;/*记得要输出*/
  9.           end;
  10.        end;
  11.      end;
  12. run;
复制代码

但是这种方法不可取,每读取一个观测,都要循环3*18次,判断3*18次,效率不高。
我自己写了个
data a1(rename=(col1=x1)) a2(rename=(col1=x2)) a3(rename=(col1=x3));
      set a;
    if _n_<=18 then output a1;
   else if _n_<=36 then output a2;
   else output a3;
run;
proc sql;
           create table test as
           select * from a1
           outer union corr
           select * from a2
           outer union corr
           select * from a3;
quit;
当然如果要批量的话,你可以改成宏, 希望对你有帮助。

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

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