全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1915 8
2013-01-27
大家好,我想请问一个基本的variable转换的问题。
比如我有一组data是这样的:
IDXYZ

1

0

2

4

1

1

3

66

1

2

5

78

2

0

6

5

2

1

5

6

2

2

.

5

3

0

4

4

3

1

8

9

3

2

4

3



现在我想新建3个variables,分别为X0_Y(即当x=0时,y的值),X1_Y, X2_Y, 变成如下
IDXYZX0_YX1_YX2_Y

1

0

2

4

2

3

5

1

1

3

66

2

3

5

1

2

5

78

2

3

5

2

0

6

5

6

5

.

2

1

5

6

6

5

.

2

2

.

5

6

5

.

3

0

4

4

4

8

4

3

1

8

9

4

8

4

3

2

4

3

4

8

4

对于同样的ID,X0_Y, X1_Y, X2_Y 分别重复三次。

请问怎样的SAS code可以做到?非常感谢!
二维码

扫码加我 拉你入群

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

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

全部回复
2013-1-27 08:33:36
data test;
        input ID X Y Z;
        cards;
1 0 2 4
1 1 3 66
1 2 5 78
2 0 6 5
2 1 5 6
2 2 . 5
3 0 4 4
3 1 8 9
3 2 4 3
;

data test1;
     do until(last.id);
            set test;
                by id;
                if x=0 then x0_y=Y;
                else if x=1 then x1_y=Y;
                else if x=2 then x2_y=Y;
        end;
        do until(last.id);
            set test;
                by id;
                output;
        end;
run;
二维码

扫码加我 拉你入群

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

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

2013-1-28 21:45:59
pobel 发表于 2013-1-27 08:33
data test;
        input ID X Y Z;
        cards;
你好,非常感谢你的热心解答,程序很有趣,谢谢!
二维码

扫码加我 拉你入群

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

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

2013-1-29 20:06:18
pobel 发表于 2013-1-27 08:33
data test;
        input ID X Y Z;
        cards;
请问:是do until end全部执行完,然后才开始执行下一个do么?
如下这样写的程序错在哪里?
data test;
         input ID X Y Z;
         cards;
1 0 2 4
1 1 3 66
1 2 5 78
2 0 6 5
2 1 5 6
2 2 . 5
3 0 4 4
3 1 8 9
3 2 4 3
;

data test1;
      do until(last.id);
             set test;
                 by id;
                 if x=0 then x0_y=Y;
                 else if x=1 then x1_y=Y;
                 else if x=2 then x2_y=Y;
         end;
         set test;
run;
二维码

扫码加我 拉你入群

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

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

2013-1-29 21:27:08
chenys625 发表于 2013-1-29 20:06
请问:是do until end全部执行完,然后才开始执行下一个do么?
如下这样写的程序错在哪里?
data test; ...
请问:是do until end全部执行完,然后才开始执行下一个do么?

是的。语句是顺序执行的。
前面的do-until-end语句是用来得到每一个ID的所有Y的值,并生成新的变量。
后面的do-until-end是读取该ID的每一条记录并且输出(output),这样上一步所得到的X0_Y, X1_Y, X2_Y就一并输出了。

如下这样写的程序错在哪里?

这样写的话,前一个do-until-end得到了每一个ID的X0_Y, X1_Y, X2_Y,而后面的部分只是读取一条记录,而不是一个ID的所有记录。具体来说:
_N_=1:
   a. do-until-end 语句块能得到ID=1时的X0_Y, X1_Y, X2_Y
   b. 后面的SET语句取出test第一条记录,然后输出。

_N_=2:
   a. do-until-end 语句块能得到ID=2时的X0_Y, X1_Y, X2_Y  
   b. 后面的SET语句取出test第二条记录,,然后输出。此时取出的记录仍是ID=1,而X0_Y, X1_Y, X2_Y 却是ID=2时的Y值。
_N_=3 情况与_N_=2相似。

_N_=4:
   do-until-end语句会试图读取下一个ID的记录,由于test只有3个ID,所以没有可读的数据,整个DATA步就此(SET语句)结束。

二维码

扫码加我 拉你入群

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

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

2013-1-29 21:46:43
pobel 发表于 2013-1-29 21:27
请问:是do until end全部执行完,然后才开始执行下一个do么?

是的。语句是顺序执行的。
非常感谢,跟你总是能学到很多东西。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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