楼主: propath
2001 8

请教一个variable转换的基础问题 [推广有奖]

  • 0关注
  • 1粉丝

本科生

73%

还不是VIP/贵宾

-

威望
0
论坛币
1491 个
通用积分
1.0794
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
17406 点
帖子
90
精华
0
在线时间
115 小时
注册时间
2012-9-1
最后登录
2023-11-19

楼主
propath 发表于 2013-1-27 04:14:57 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
大家好,我想请问一个基本的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可以做到?非常感谢!
二维码

扫码加我 拉你入群

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

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

关键词:Variable ABLE IAB ABL VaR 新建

沙发
pobel 在职认证  发表于 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;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
chenys625 + 1 + 1 + 1 分析的有道理
webgu + 1 + 1 + 1 精妙

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

和谐拯救危机

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

板凳
chenys625 发表于 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;

报纸
pobel 在职认证  发表于 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语句)结束。

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
chenys625 + 1 + 1 + 1 分析的有道理

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

和谐拯救危机

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

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

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

是的。语句是顺序执行的。
附加的问题,_n_=4的时候为什么后面的set也不读了呢?

8
pobel 在职认证  发表于 2013-1-29 21:57:20
chenys625 发表于 2013-1-29 21:48
附加的问题,_n_=4的时候为什么后面的set也不读了呢?
如果一个DATA步包含多个set语句时,那么只要其中任意一个SET语句没有数据可读的时候,整个DATA步就结束了。


因此,有SET语句的data步,一般不是在run语句结束的,而是在SET语句结束的。

data test;
   do x=1 to 3;
     output;
   end;
run;

data test1;
    put /"Before SET statement:" _n_;
        set test;
        set sashelp.class;
        put "After SET statement:" _n_;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
chenys625 + 1 + 1 + 1 分析的有道理

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

和谐拯救危机

9
chenys625 发表于 2013-1-29 22:03:06
pobel 发表于 2013-1-29 21:57
如果一个DATA步包含多个set语句时,那么只要其中任意一个SET语句没有数据可读的时候,整个DATA步就结束了 ...
Very clear! Thanks!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 21:28