<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[按照某个变量的值拆分数据集（为循环和批量分析服务）]]></title><description><![CDATA[<p dir="auto">/*按照变量date的值来拆分数据集<br />
如date=19960131生成一个数据集，date=19960228生成一个<br />
现在有很多个，到20080731了<br />
*/<br />
/*方法一<br />
思路是先把distinct date的值变为宏变量，然后用data步输出。<br />
反复读数据，会很慢<br />
*/<br />
data a;<br />
do date=1991 to 2011;<br />
output;<br />
end;<br />
run;<br />
data <em>null</em>;<br />
set a end=last;<br />
call symputx('date'||left(<em>n</em>),date);<br />
if last then call symput ('n',<em>n</em>);<br />
run;<br />
%macro split;<br />
%do i=1 %to &amp;n;<br />
data b&amp;i;<br />
set a;<br />
where date=&amp;&amp;date&amp;i;<br />
run;<br />
%end;<br />
%mend;<br />
%split;</p>
<p dir="auto">/<em>方法二</em>/<br />
data date;<br />
date=input("19960131",yymmdd8.);<br />
output;<br />
date=input("19960228",yymmdd8.);<br />
output;<br />
date=input("19960309",yymmdd8.);<br />
output;<br />
run;</p>
<p dir="auto">data <em>null</em>;<br />
set date;<br />
call execute ("data data_"||strip(put(date,yymmddn8.))||";set a;if date="||date||";run;");<br />
run;</p>
<p dir="auto">/<em>方法三</em>/</p>
<p dir="auto">data a;<br />
format target_day $8.;<br />
input target_day $;<br />
cards;<br />
20120730<br />
20120731<br />
20120810<br />
20120817<br />
;run;</p>
<p dir="auto">%macro segmentation();<br />
proc sort data = a out = work.t1(keep = target_day) nodupkey;<br />
by target_day;<br />
run;<br />
data <em>null</em>;<br />
set work.t1 nobs=n;<br />
call symputx(compress("set_"||<em>n</em>), put(input(target_day, yymmdd8.), yymmddn8.));<br />
if <em>n</em> = 1 then call symputx('n',n);<br />
run;<br />
data %do ii = 1 %to &amp;n.;<br />
data_&amp;&amp;set_&amp;ii..<br />
%end;;<br />
set a;<br />
select (target_day);<br />
%do ii = 1 %to &amp;n.;<br />
when ("&amp;&amp;set_&amp;ii..") output data_&amp;&amp;set_&amp;ii..;<br />
%end;<br />
otherwise;<br />
end;<br />
run;<br />
proc sql;<br />
drop table work.t1;<br />
quit;<br />
%mend;<br />
%segmentation();</p>
]]></description><link>https://actuarygarden.com/topic/23/按照某个变量的值拆分数据集-为循环和批量分析服务</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 21:42:18 GMT</lastBuildDate><atom:link href="https://actuarygarden.com/topic/23.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 May 2020 01:24:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 按照某个变量的值拆分数据集（为循环和批量分析服务） on Mon, 25 May 2020 01:24:30 GMT]]></title><description><![CDATA[<p dir="auto">/*按照变量date的值来拆分数据集<br />
如date=19960131生成一个数据集，date=19960228生成一个<br />
现在有很多个，到20080731了<br />
*/<br />
/*方法一<br />
思路是先把distinct date的值变为宏变量，然后用data步输出。<br />
反复读数据，会很慢<br />
*/<br />
data a;<br />
do date=1991 to 2011;<br />
output;<br />
end;<br />
run;<br />
data <em>null</em>;<br />
set a end=last;<br />
call symputx('date'||left(<em>n</em>),date);<br />
if last then call symput ('n',<em>n</em>);<br />
run;<br />
%macro split;<br />
%do i=1 %to &amp;n;<br />
data b&amp;i;<br />
set a;<br />
where date=&amp;&amp;date&amp;i;<br />
run;<br />
%end;<br />
%mend;<br />
%split;</p>
<p dir="auto">/<em>方法二</em>/<br />
data date;<br />
date=input("19960131",yymmdd8.);<br />
output;<br />
date=input("19960228",yymmdd8.);<br />
output;<br />
date=input("19960309",yymmdd8.);<br />
output;<br />
run;</p>
<p dir="auto">data <em>null</em>;<br />
set date;<br />
call execute ("data data_"||strip(put(date,yymmddn8.))||";set a;if date="||date||";run;");<br />
run;</p>
<p dir="auto">/<em>方法三</em>/</p>
<p dir="auto">data a;<br />
format target_day $8.;<br />
input target_day $;<br />
cards;<br />
20120730<br />
20120731<br />
20120810<br />
20120817<br />
;run;</p>
<p dir="auto">%macro segmentation();<br />
proc sort data = a out = work.t1(keep = target_day) nodupkey;<br />
by target_day;<br />
run;<br />
data <em>null</em>;<br />
set work.t1 nobs=n;<br />
call symputx(compress("set_"||<em>n</em>), put(input(target_day, yymmdd8.), yymmddn8.));<br />
if <em>n</em> = 1 then call symputx('n',n);<br />
run;<br />
data %do ii = 1 %to &amp;n.;<br />
data_&amp;&amp;set_&amp;ii..<br />
%end;;<br />
set a;<br />
select (target_day);<br />
%do ii = 1 %to &amp;n.;<br />
when ("&amp;&amp;set_&amp;ii..") output data_&amp;&amp;set_&amp;ii..;<br />
%end;<br />
otherwise;<br />
end;<br />
run;<br />
proc sql;<br />
drop table work.t1;<br />
quit;<br />
%mend;<br />
%segmentation();</p>
]]></description><link>https://actuarygarden.com/post/56</link><guid isPermaLink="true">https://actuarygarden.com/post/56</guid><dc:creator><![CDATA[谢远涛]]></dc:creator><pubDate>Mon, 25 May 2020 01:24:30 GMT</pubDate></item></channel></rss>