SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2728|回复: 12
打印 上一主题 下一主题

请问数据集的转换问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-2-25 09:49:52 | 只看该作者

请问数据集的转换问题

想把如下数据集A
a b c  r
1 5 4 22
1 5 4 4
1 5 4 9
2 7 3 11
2 7 3 5
2 7 3 7
转换成B
a b c r1 r2 r3
1 5 4 22 4  9
2 7 3 11 5  7

大家有什么简单一点的方法?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-2-25 11:16:44 | 只看该作者
There are too many ways to do it.  One of the simplest is shown here.

data a;
input a b c r;
datalines;
1 5 4 22
1 5 4 4
1 5 4 9
2 7 3 11
2 7 3 5
2 7 3 7
;

data b(drop=r);
retain r1 r2 r3;
set a;
by a b c;
if first.c then do;
  r1=.; r2=.; r3=.;
end;
if r1=. then r1=r;
else if r2=. then r2=r;
else if r3=. then r3=r;
if last.c then output;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2004-2-25 13:21:37 | 只看该作者
谢谢指点,不过请问if first.c这句话什么意思?这是属于sas哪一块语句的内容?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-2-25 17:36:31 | 只看该作者

找到资料了,自问自答 :)

How the DATA Step Identifies BY Groups
In the DATA step, SAS identifies the beginning and end of each BY group by creating two temporary variables for each BY variable: FIRST.variable and LAST.variable. These temporary variables are available for DATA step programming but are not added to the output data set. Their values indicate whether an observation is


the first one in a BY group

the last one in a BY group

neither the first nor the last one in a BY group

both first and last, as is the case when there is only one observation in a BY group.

You can take actions conditionally, based on whether you are processing the first or the last observation of a BY group.
When an observation is the first in a BY group, SAS sets the value of the FIRST.variable to 1. For all other observations in the BY group, the value of the FIRST.variable is 0. Likewise, if an observation is the last in a BY group, SAS sets the value of LAST.variable to 1. For all other observations in the BY group, the value of LAST.variable is 0. If the observations are sorted by more than one BY variable, the FIRST.variable for each variable in the BY statement is set to 1 at the first occurrence of a new value for the variable.

This example shows how SAS uses the FIRST.variable and LAST.variable to flag the beginning and end of four BY groups. Six temporary variables are created within the program data vector. These variables can be used during the DATA step, but they do not become variables in the new data set.

In the figure that follows, observations in the SAS data set are arranged in an order that can be used with this BY statement:

by State City ZipCode;
SAS creates the following temporary variables: FIRST.State, LAST.State, FIRST.City, LAST.City, FIRST.ZipCode, and LAST.ZipCode.


FIRST. and LAST. Values for Four BY Groups







Chapter Contents
Previous
Next
Top of Page


Copyright 1999 by SAS Institute Inc., Cary, NC, USA. All rights reserved.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-2-26 12:07:49 | 只看该作者
proc transpose data=tem out=tem1(drop=_name_) prefix=r;
by a b c;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2004-3-1 14:27:08 | 只看该作者

有没有更灵活的方法

提问中a b c值相同的记录均为三条,若a b c值相同的记录数任意呢,如
a b c r
1 2 3 1
1 2 3 2
1 2 3 3
......
1 2 3 n
将此集合转换为
a b c r1 r2 r3 ...... rn
1 2 3 1  2  3  ......  n
有没有通用的转换方法
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2004-3-2 01:00:22 | 只看该作者
Just follow my previous example, I did some expansion.  It may not be the best way, but it works.

data a;
input a b c r;
datalines;
1 5 4 22
1 5 4 4
1 5 4 9
1 5 4 22
1 5 4 4
1 5 4 9
2 7 3 11
2 7 3 5
2 7 3 7
2 7 3 11
;

proc sql;
create table a as
select *, count(*) as cnt
from a
group by a, b, c;
quit;

%macro expand;

proc sql noprint;
select max(cnt) into :maxcnt
from a;
quit;

data b(drop=r);
retain
%do i=1 %to &maxcnt;
   r&i
%end;;
set a;
by a b c;
if first.c then do;
%do i=1 %to &maxcnt;
   r&i=.;
%end;
end;
%do i=1 %to &maxcnt;
     if r&i=. then do;
        r&i=r;
        goto abc;
     end;
%end;
abc:
if last.c then output;  
run;

%mend;

%expand;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2004-3-2 10:03:35 | 只看该作者
多谢指点,因为工作原因,其实我才刚开始学sas。我对宏不是很熟悉,有没有介绍宏比较详细的sas书籍
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2004-3-3 10:49:49 | 只看该作者
我不太明白为什么你的程序里maxcnt可以取出两个值,maxcnt不是一个变量吗?也许这个问题太菜鸟级了,见笑。如果解释起来不是很困难,请不吝赐教,谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2004-3-3 23:14:40 | 只看该作者
In the program, maxcnt has only one value which is 6.  It is the maximum count of the records for a distinct combination of (a,b,c).
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-8 15:32 , Processed in 0.322826 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表