基于另一个表的索引值的SAS数据处理
我需要以下建议(在SAS企业指南6.1中工作) 我有两张桌子: 表1:状态、日期、十进制值、描述(字符长度4);表1对每个州都有多个描述、日期和值 表2:州、年、季、描述(字符长度4)、值; 表2有多条相同状态和描述的记录,但值随日期而变化 示例表:基于另一个表的索引值的SAS数据处理,sas,Sas,我需要以下建议(在SAS企业指南6.1中工作) 我有两张桌子: 表1:状态、日期、十进制值、描述(字符长度4);表1对每个州都有多个描述、日期和值 表2:州、年、季、描述(字符长度4)、值; 表2有多条相同状态和描述的记录,但值随日期而变化 示例表: Table 1 state date description value 1 IA 11/1/2013 A -0.5 IA 11/1/2013 B
Table 1
state date description value 1
IA 11/1/2013 A -0.5
IA 11/1/2013 B 4.5
IA 9/1/2012 A 1.2
IA 9/1/2012 B 5
OH 6/1/2013 A 1.2
OH 6/1/2013 B -2
对于表1中的每个观察,我希望能够识别与观察相关的日期,然后将表2中从该日期起1年内的特定状态和描述值相加,保存总和,然后对表1中的每个记录重复该值
我正在寻找的结果表3
state date Descr Value 1 Sum of Value 2 (over a year)
IA 11/1/2013 A -0.5 =sum (Value 2 from (2013 quarter 4, 2013 quarter 3, 2013 quarter 2, 2013 quarter 1) for IA with desc = A)
IA 09/1/2012 B 5.0 =sum(Value 2 from (2012 quarter 2, 2012 quarter 1, 2011 quarter 4, 2011 quarter 3) for IA with Desc = B)
我正在努力从表1中找出正确的观察结果,以便在表2中找出日期、状态和描述
谢谢。最简单的答案很可能是最好的:SQL连接。将季度转换为日期——我认为这比将东西转换为季度容易,因为
intck
非常友好。我在这里展示了如何在dataset或sql中执行此操作
data Table1;
input state $ date :mmddyy10. description $ value1;
format date DATE9.;
datalines;
IA 11/1/2013 A -0.5
IA 11/1/2013 B 4.5
IA 9/1/2012 A 1.2
IA 9/1/2012 B 5
OH 6/1/2013 A 1.2
OH 6/1/2013 B -2
;;;;
data table2;
input State $ Year Quarter Description $ Value2 :comma10.;
datevar = mdy(quarter*3,1,year);
format datevar DATE9.;
datalines;
IA 2013 4 A 40,350
IA 2013 3 A 1
IA 2013 2 A 150,000
IA 2013 1 A 100,000
IA 2012 4 A 5,000
IA 2012 3 A 25,000
IA 2012 2 B 50,000
;;;;
run;
proc sql;
create table table3 as
select t1.state, t1.date,t1.description, t1.value1, sum(t2.value2) as value2sum
from table1 t1 left join table2 t2
on (t1.state=t2.state and t1.description=t2.description
and 0 le intck('Quarter',mdy(t2.quarter*3,1,t2.year),t1.date) lt 4)
group by t1.state, t1.date,t1.description,t1.value1;
quit;
您可能需要根据您希望基于什么值包含哪些记录来调整等式,并且您可能需要调整
intck
来定义所需的方式(您要求2012年第二季度为2012年9月1日,这会很奇怪,因为9月1日通常肯定是第三季度的一部分;如果您的公司不是这样,请使用intck
中的移位指数来调整公司的季度).我不明白您是如何从表3提供的数据和解释中得到的。为什么只有两行?表3只是一个示例。最终结果是表1中的每个唯一状态、日期、描述记录都有一行。我可以使用表1中的日期将其更改为年和季度,以便于查找值在表3中,我还认为我可以使用宏来循环表1中的观察结果,但我不确定如何识别这些观察结果。不,宏不是解决问题的方法。我对你在这里使用的语言感到困惑。你在表1中识别观察结果有什么困难?或者,你的意思是,识别什么ich表2观察值与表1观察值匹配?我肯定是想得太多了(我要为表1中的每个观察值创建临时子表,从表2中获取日期范围内的匹配记录,使用proc方法将值相加,然后再返回)。这是一个更优雅的方法。谢谢。
data Table1;
input state $ date :mmddyy10. description $ value1;
format date DATE9.;
datalines;
IA 11/1/2013 A -0.5
IA 11/1/2013 B 4.5
IA 9/1/2012 A 1.2
IA 9/1/2012 B 5
OH 6/1/2013 A 1.2
OH 6/1/2013 B -2
;;;;
data table2;
input State $ Year Quarter Description $ Value2 :comma10.;
datevar = mdy(quarter*3,1,year);
format datevar DATE9.;
datalines;
IA 2013 4 A 40,350
IA 2013 3 A 1
IA 2013 2 A 150,000
IA 2013 1 A 100,000
IA 2012 4 A 5,000
IA 2012 3 A 25,000
IA 2012 2 B 50,000
;;;;
run;
proc sql;
create table table3 as
select t1.state, t1.date,t1.description, t1.value1, sum(t2.value2) as value2sum
from table1 t1 left join table2 t2
on (t1.state=t2.state and t1.description=t2.description
and 0 le intck('Quarter',mdy(t2.quarter*3,1,t2.year),t1.date) lt 4)
group by t1.state, t1.date,t1.description,t1.value1;
quit;