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. value;
format time yymmdd8.;
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.*,
coalesce(raw.name,distin.name) as name,
distin.*
from raw,distin
where raw.name=distin.name;
quit;
data _null_;
set raw_num;
by name;
if first.name then do;
call execute('data '||dataname||';
set raw_num;run;');
end;
run;
data final;
delete;
%macro mergr(sum_num);
%do i=1 %to &sum_num;
data data_%eval(&i);
set data_%eval(&i);
if v^=%eval(&i) then delete;
rename name=name&i time=time&i value=value&i;
run;
data final;
merge final data_%eval(&i);
run;
%end;
proc datasets nolist;
delete data:;
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. value ;
format time yymmdd10.;
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.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]
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.name,data1.date,data2.date as date2 ,data1.state,data2.remark
from data1,data2
where data1.name=data2.name and abs(data2.date-data1.date)<32;
quit;
[/code:1mufidsu]作者: shiyiming 时间: 2010-10-19 05:38 标题: Re: 如何多对个数据集进行横向合并? [code:1fls36tk]data a;
input name $ data yymmdd9. state $;
format data date9.;
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. remark;
format data date9.;
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.name,d1.data,d2.data2,state,remark
from a d1,b d2
where d1.name=d2.name
and mon_1<=d2.mon<=mon_2;
quit;[/code:1fls36tk]作者: shiyiming 时间: 2010-10-19 21:04 标题: 谢谢! 谢谢! <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->