SAS中文论坛

标题: 数据合并疑问 [打印本页]

作者: shiyiming    时间: 2012-6-12 12:25
标题: 数据合并疑问
现有100只股票数据,命名形如:daysh600000,daysh600004...,daysz000001....,600000等是股票代码(id);数据的结构都一样,内含变量,date,open,high,close等,但不含股票代码:
data daysh600000;
    input date open hight low clsoe;
    cards;
2011 29.5 29.8 27 27.75
;
run;

现在想请教,如何合并这些数据,新数据中包含股票代码?新的数据格式:
   id       date    open  high  low close
600000     2011   29.5  29.8  27   27.75
600000      ....     ....    ...    ...     ....  
600004     2011   7.72  8.56  7.69 8.25
    ...
敬请高手指点迷津。
作者: shiyiming    时间: 2012-6-12 14:13
标题: Re: 数据合并疑问
一个stupid的办法。
[code:3b6hvpqh]
proc sql noprint;select memname into:dsnlist separated by " " from dictionary.tables where libname="WORK";run;

data tar;length id $ 32; set daysh600000;stop;run;

%macro inserttable(dsnlist);
%let n=%eval(%sysfunc(count(&dsnlist,%str( )))+1);
%do i=1 %to &n;
        %let dsn=%scan(&dsnlist,&i);
        proc sql;
                insert into tar select "&dsn", date, open, hight, low, clsoe from &dsn;
        quit;
%end;
%mend;
[/code:3b6hvpqh]
再想想吧。。。
作者: shiyiming    时间: 2012-6-12 16:04
标题: Re: 数据合并疑问
首先表示感谢,继续请教:data tar这一段的id,运行提示为初始化,您的意思是?
作者: shiyiming    时间: 2012-6-12 16:58
标题: Re: 数据合并疑问
[quote="yatming":1x3odjet]一个stupid的办法。
[code:1x3odjet]
proc sql noprint;select memname into:dsnlist separated by " " from dictionary.tables where libname="WORK";run;

data tar;length id $ 32; set daysh600000;stop;run;

%macro inserttable(dsnlist);
%let n=%eval(%sysfunc(count(&dsnlist,%str( )))+1);
%do i=1 %to &n;
        %let dsn=%scan(&dsnlist,&i);
        proc sql;
                insert into tar select "&dsn", date, open, hight, low, clsoe from &dsn;
        quit;
%end;
%mend;
[/code:1x3odjet]
再想想吧。。。[/quote:1x3odjet]

非常感谢,有些疑问还请指点:
data tar;length id $ 32; set daysh600000;stop;run;这里id没有初始化,daysh600000中并没有该变量;
%macro inserttable(dsnlist);中参数dsnlist是上面proc sql的生成的宏变量,解析的事数据库中数据名。用在这里我不大明白?谢谢
作者: shiyiming    时间: 2012-6-12 19:38
标题: Re: 数据合并疑问
data step的思想是构造一张空表作为target,包含了原先的variables,在加上需要存表名的那个id变量。所以只定义了id,其他变量用set dataset load进来,最后stop目的为了不load数据,只构造结构。
macro最后要运行一下:%inserttable(dsnlist=&dsnlist)
思想比较简单,没什么巧妙之处。
把需要合并的table的table name放到一个宏字符串,然后在宏里遍历这个字符串,每次迭代得到一个table name,然后对应的table插入到target,插入的时候把需要的table name作为id。当然迭代中proc sql也可以使用data step。
id的值即是table name,table name也包含了需要的代码。如果需要提取代码再使用字符串函数处理一下,也可以在插入target的时候直接对table name进行提取得到要的代码。
作者: shiyiming    时间: 2012-6-13 17:24
标题: Re: 数据合并疑问
[quote="yatming":3ar0vuex]data step的思想是构造一张空表作为target,包含了原先的variables,在加上需要存表名的那个id变量。所以只定义了id,其他变量用set dataset load进来,最后stop目的为了不load数据,只构造结构。
macro最后要运行一下:%inserttable(dsnlist=&dsnlist)
思想比较简单,没什么巧妙之处。
把需要合并的table的table name放到一个宏字符串,然后在宏里遍历这个字符串,每次迭代得到一个table name,然后对应的table插入到target,插入的时候把需要的table name作为id。当然迭代中proc sql也可以使用data step。
id的值即是table name,table name也包含了需要的代码。如果需要提取代码再使用字符串函数处理一下,也可以在插入target的时候直接对table name进行提取得到要的代码。[/quote:3ar0vuex]

感谢讲解,谢谢。




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