SAS中文论坛

标题: 如何多对个数据集进行横向合并? [打印本页]

作者: shiyiming    时间: 2009-12-12 00:51
标题: 如何多对个数据集进行横向合并?
现在有数据集
如下:

name           time         value
a        20000308        1
a        20000603        2
a        20011028        3
a        20001218        3
b        20040308        3
b        20040604        7
b        20041206        3
b        20050213        67
.                    
.
.
.

z        20050308        7
z        20050608        55
z        20051208        6
z        20060104        33

name从A到Z一共有26个,我想得到下面的结果:

time         a        time        b        ....        time        z
20000308        1        20040308        3        ....        20050308        7
20000603        2        20040604        7        ....        20050608        55
20011028        3        20041206        3        ....        20051208        6
20001218        3        20050213        67        ....        20060104        33

请问用什么办法可以实现,多谢!
作者: shiyiming    时间: 2009-12-12 10:02
标题: Re: 如何多对个数据集进行横向合并?
[code:aq0si3oi]data raw;
   input name $ time yymmdd8. value;
datalines;
a 20000308 1
a 20000603 2
a 20011028 3
a 20001218 3
b 20040308 3
b 20040604 7
b 20041206 3
b 20050213 67
z 20050308 7
z 20050608 55
z 20051208 6
z 20060104 33
;

data temp(drop=time value);
   set raw;
   group=mod(_n_-1,4);
   id=cat('time_',name);
   temp=time;
   output;
   id=cat('value_',name);
   temp=value;
   output;
run;

proc sort data=temp;
   by group;
run;

proc transpose data=temp out=temp(drop=group _name_);
   id id;
   by group;
   var temp;
run;[/code:aq0si3oi]
作者: shiyiming    时间: 2009-12-12 18:24
标题: Re: 如何多对个数据集进行横向合并?
并不只有三个字母 是从a 到Z的26个字母,有的字母有四条数据,有的则有三条,请问该如何处理呢?
作者: shiyiming    时间: 2009-12-12 19:10
标题: Re: 如何多对个数据集进行横向合并?
<!-- s:cry: --><img src="{SMILIES_PATH}/icon_cry.gif" alt=":cry:" title="Crying or Very sad" /><!-- s:cry: -->
大爷教训的对,奴家知道错了...
作者: shiyiming    时间: 2009-12-12 22:25
标题: Re: 如何多对个数据集进行横向合并?
[code:1hw24moh]data b;
   set a;
   lagName = lag(Name);
   if Name ^= LagName then n = 0;
   n+1;
proc sort data = b out = c; by n;
proc transpose data = c out = c1 prefix = time_; id name; by n; var time;
proc transpose data = c out = c2; id name; by n; var value; run;
data d;
   merge c1 c2;   by n;
        drop n _name_;
run;[/code:1hw24moh]
作者: shiyiming    时间: 2009-12-13 23:58
标题: Re: 如何多对个数据集进行横向合并?
HOPEWELL,谢谢你的帮助还来不及了,还有JINGJU11,都一并说个3Q了!
作者: shiyiming    时间: 2009-12-18 09:59
标题: Re: 如何多对个数据集进行横向合并?
[code:zmpac0jf]data raw;
   input name $ time yymmdd8&#46; value;
   format time yymmdd8&#46;;
datalines;
a 20000308 1
a 20000603 2
a 20011028 3
a 20001218 3
b 20040308 3
b 20040604 7
b 20041206 3
b 20050213 67
z 20050308 7
z 20050608 55
z 20051208 6
z 20060104 33
;
proc sql;
create table distin as select distinct
name from raw;
quit;
data distin;
set distin;
call symput('name_num',_n_);
v=symget('name_num');
dataname=catx('_','data',v);
run;
proc sql;
create table raw_num as select raw&#46;*,
                         coalesce(raw&#46;name,distin&#46;name) as name,
                         distin&#46;*
from raw,distin
where raw&#46;name=distin&#46;name;
quit;
data _null_;
set raw_num;
by name;
if first&#46;name then do;
call execute('data '||dataname||';
              set raw_num;run;');
end;
run;
data final;
delete;
%macro mergr(sum_num);
%do i=1 %to &amp;sum_num;
data data_%eval(&amp;i);
set data_%eval(&amp;i);
if v^=%eval(&amp;i) then delete;
rename name=name&amp;i time=time&amp;i value=value&amp;i;
run;
data final;
merge final data_%eval(&amp;i);
run;
%end;
proc datasets nolist;
delete data&#58;;
run;
quit;
%mend;
data _null_;
call execute('%mergr(3)');run;
data final;
set final;
drop v dataname;
run;
[/code:zmpac0jf]
作者: shiyiming    时间: 2010-10-3 01:00
标题: 如何按照相近的时间进行横向合并?
比如我有如下的数据
data1
name       data         state
Jim      20051001       F
Jim      20050909       D
Tom     20030208       B
Kin       20081215       C
Kin       20020309       A
Kin       20080803       B


data2
name       data         remark
Jim      20051010       12
Jim      20050901       34
Jim      20051209       34
Jim      20050709       34
Tom     20060203       11
Kin       20071120       44
Kin       20030212       33

该如何才能使同一个人的数据,按照相近的时间合并?并且要求合并后的同一笔数据,data2的时间要不能早于data1的时间。
这个问题困扰了我很久,请高手救命啊!!!!!!!!!!!!![size=150:162wrsod][/size:162wrsod]
作者: shiyiming    时间: 2010-10-3 13:57
标题: Re: 如何多对个数据集进行横向合并?
弄了好一会才基本明白意思...不知道是否理解正确
[code:2yg7bu6g]data a;
input name  $ time  yymmdd8&#46; value ;
format time yymmdd10&#46;;
datalines;
a 20000308 1
a 20000603 2
a 20011028 3
a 20001218 3
b 20040308 3
b 20040604 7
b 20041206 3
b 20050213 67
c 20040308 3
c 20040604 7
c 20041206 3
z 20050308 7
z 20050608 55
z 20051208 6
z 20060104 33
;
run;

data a;
  set a;
  by name;
  mk+1;
  if first&#46;name then mk=1;
run;
proc sort;
  by mk;
run;

proc transpose data=a out=b(drop=_name_) prefix=time_;
  var time;
  by mk;
  id name;
run;
proc transpose data=a out=c(drop=_name_) prefix=value_;
  var value;
  by mk;
  id name;
run;
data final(drop=mk);
  merge b c;
run;
[/code:2yg7bu6g]

看了jingju的,一个意思...  <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2010-10-13 02:13
标题: 还是横向合并,非常感谢!
非常感谢tianwild你的解答! 我表达得不是很好,呵呵,不好意思!
我还是想请教一个类似的问题,还是原来的数据

name data state
Jim 20051001 F
Jim 20050809 D
Tom 20030208 B
Kin 20081215 C
Kin 20020309 A
Kin 20080803 B


data2
name data remark
Jim 20051010 12
Jim 20050801 34
Jim 20051209 34
Jim 20050709 34
Tom 20060203 11
Kin 20071120 44
Kin 20030212 33

如何把这两组数据合并,如Jim的第一笔数据的时间是20051001,那要在data2的数据中找它的前后一个月的数据合并,就是如果data2中如果有时间在20050901至20051101的都和这笔资料合并起来。
那么Jim的数据就变成了
Jim 20051001 20051010 F 12
Jim 20050809 20050801 D 34
Jim 20050809 20050709 D 34

非常感谢!
作者: shiyiming    时间: 2010-10-13 10:20
标题: Re: 如何多对个数据集进行横向合并?
可以用SQL,但不知前后一个月怎么定义
[code:1mufidsu]
proc sql;
create table out as
select data1&#46;name,data1&#46;date,data2&#46;date as date2 ,data1&#46;state,data2&#46;remark
from data1,data2
where data1&#46;name=data2&#46;name and abs(data2&#46;date-data1&#46;date)&lt;32;
quit;
[/code:1mufidsu]
作者: shiyiming    时间: 2010-10-19 05:38
标题: Re: 如何多对个数据集进行横向合并?
[code:1fls36tk]data a;
input name $ data yymmdd9&#46; state $;
format data date9&#46;;
mon=month(data);
mon_1=mon-1;
mon_2=mon+1;
cards;
Jim 20051001 F
Jim 20050809 D
Tom 20030208 B
Kin 20081215 C
Kin 20020309 A
Kin 20080803 B
;
data b;
input name $ data yymmdd9&#46; remark;
format data date9&#46;;
rename data=data2;
mon=month(data);
cards;
Jim 20051010 12
Jim 20050801 34
Jim 20051209 34
Jim 20050709 34
Tom 20060203 11
Kin 20071120 44
Kin 20030212 33
;
run;
proc sql;
create table ab as
  select d1&#46;name,d1&#46;data,d2&#46;data2,state,remark
    from a d1,b d2
   where d1&#46;name=d2&#46;name
     and mon_1&lt;=d2&#46;mon&lt;=mon_2;
quit;[/code:1fls36tk]
作者: shiyiming    时间: 2010-10-19 21:04
标题: 谢谢!
谢谢! <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2