SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 969|回复: 5
打印 上一主题 下一主题

数据合并疑问

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2012-6-12 12:25:14 | 只看该作者

数据合并疑问

现有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
    ...
敬请高手指点迷津。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2012-6-12 14:13:23 | 只看该作者

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]
再想想吧。。。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2012-6-12 16:04:28 | 只看该作者

Re: 数据合并疑问

首先表示感谢,继续请教:data tar这一段的id,运行提示为初始化,您的意思是?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2012-6-12 16:58:49 | 只看该作者

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的生成的宏变量,解析的事数据库中数据名。用在这里我不大明白?谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2012-6-12 19:38:35 | 只看该作者

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进行提取得到要的代码。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2012-6-13 17:24:28 | 只看该作者

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]

感谢讲解,谢谢。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-6 09:25 , Processed in 0.160078 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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