SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1821|回复: 18
打印 上一主题 下一主题

问一个merge问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-1-12 15:42:12 | 只看该作者

问一个merge问题

我现在的dataset
name var1 var2
A         1     3
A         3     4
A         5     2
B         2     1
B         4     0
C        3      6

我想把每个name的var1都写成1-5的形式,即
name   var1  var2
A  1  3
A  2  .
A  3  4
A  4  2
A  5  .
B  1  .
B  2  1
B  3  .
B  4  0
B  5  .
C  1  .
C  2  .
C  3  6
C  4  .
C  5  .

我大脑有点秀逗了,我试图直接用merge,但是貌似不成,用sql好像也不能做到完全merge。咋办?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-1-12 18:04:54 | 只看该作者

Re: 问一个merge问题

有点复杂,应该还有更简单的步骤。
[code:lxlqs776]data raw;
        input name $ var1 var2;
        datalines;
A 1 3
A 3 4
A 5 2
B 2 1
B 4 0
C 3 6
;
run;

data tmp;
        do name='A','B','C';
                do var1=1 to 5;
                        output;
                end;
        end;
run;

proc sort data=raw;
by name var1;
run;
proc sort data=tmp;
by name var1;
run;

data result;
        merge tmp raw;
        by name var1;
run;
[/code:lxlqs776]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-1-12 18:46:53 | 只看该作者

Re: 问一个merge问题

谢谢哈,不过我的name不止A, B, C而已,而是一大串复杂的名字。另外var也不是简单的1,2,3...这样子,我只是为了简化问题随手写的,实际上是一个时间序列,不过这个倒是可以construct一个dataset出来。然后把使得每一个name的var1都包含这个dataset。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-1-12 19:09:16 | 只看该作者

Re: 问一个merge问题

data step can do
and
means proc also can do!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-1-12 20:48:28 | 只看该作者

Re: 问一个merge问题

data step写成这样成不?
byes大侠说的第2种方法我就不会写了...  <!-- s:? --><img src="{SMILIES_PATH}/icon_confused.gif" alt=":?" title="Confused" /><!-- s:? -->
[code:39bh1dvx]proc sql noprint;
        select max(var1)-min(var1)+1 into&#58;n from raw;
quit;

%let n=&amp;n;

data temp(drop=_v&#58;);
        array arr{*} _v1-_v&amp;n;
        do _n_=1 by 1 until(last&#46;name);
                set raw;
                by name;
                arr(var1)=var2;
        end;
        do var1=1 to dim(arr);
                var2=arr(var1);
                output;
        end;
run;[/code:39bh1dvx]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-1-12 21:28:41 | 只看该作者

Re: 问一个merge问题

仰视......

我都没看懂怎么实现的。

如果我有多个variable呢?比如:
[code:3eubphfq]
data raw;
   input name $ week var1 var2;
   datalines;
A 3 1 3
A 5 3 4
A 53 5 2
B 2 1 &#46;
B 26 0 3
C 1 6 &#46;
;
run;
[/code:3eubphfq]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-1-13 12:34:01 | 只看该作者

Re: 问一个merge问题

What about this? <!-- s:-) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":-)" title="Smile" /><!-- s:-) -->

[code:1zh0zsok]options validvarname = any;
%let varsBesidesVar1Var2 = name week;

proc sort data = raw;
  by &amp;varsBesidesVar1Var2&#46;;
run;

proc transpose data = raw
               out = results(drop = _name_);
  by &amp;varsBesidesVar1Var2&#46;;
  var var2;
  id var1;
run;

proc transpose data = results
               out = results(rename = (col1 = var2
                                       _name_ = var1
                                      )
                            );
  by &amp;varsBesidesVar1Var2&#46;;
run;

proc sort data = results;
  by &amp;varsBesidesVar1Var2&#46;
     var1;
run;
[/code:1zh0zsok]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2010-1-13 15:23:29 | 只看该作者

Re: 问一个merge问题

To dengzi:
你第二次给的示例数据有个VAR1=0的情况,用原来hopewell的方法行不通。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2010-1-13 16:14:04 | 只看该作者

Re: 问一个merge问题

data aa;
   input name $  var1 var2;
   cards;
A 1 3
A 3 4
A 5 2
B 2 1
B 4 0
C 3 6
;
run;

data bb (keep=name var1);
              set aa;
                      do var1=1 to 5 by 1;
                    output;
                          end;
run;

proc sort data =aa;
       by name var1;
run;

  proc sort data =bb out=bb1 nodupkey;
       by name var1;
run;

data cc;
      merge aa bb1;
          by   name var1;
run;


这个是个小数据,要是做数据量很大的就不太可行,效率太低。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2010-1-13 18:47:06 | 只看该作者

Re: 问一个merge问题

no,no,no
just only a data step


proc sql not nedded
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-12 21:17 , Processed in 0.069942 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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