SAS-lead函数的使用
SAS-use of lead function
假设数据集有三列
Date Region Price
01-03 A 1
01-03 A 2
01-03 B 3
01-03 B 4
01-03 A 5
01-04 B 4
01-04 B 6
01-04 B 7
我尝试通过以下代码按日期和地区获取铅价。
data want;
set have;
by _ric date_l_;
do until (eof);
set have(firstobs=2 keep=price rename=(price=lagprice)) end=eof;
end;
if last.date_l_ then call missing(lagprice);
run;
然而,WANT只有一个观察结果。然后我创建 new_date=date
并尝试另一个代码:
data want;
set have nobs=nobs;
do _i = _n_ to nobs until (new_date ne Date);
if eof1=0 then
set have (firstobs=2 keep=price rename=(price=leadprice)) end=eof1;
else leadprice=.;
end;
run;
使用这段代码,SAS 运行缓慢。所以我觉得这段代码也不合适。任何人都可以提出一些建议吗?谢谢
您可以使用 proc expand
按组生成数字变量的潜在客户。请尝试以下方法:
第 1 步:按地区、日期排序
proc sort data=have;
by Region Date;
run;
第 2 步:创建一个新的 ID 变量来表示观测值
因为每个地区的每个日期都有多个值,我们需要生成一个新的 ID 变量,以便 proc expand
使用 lead
按观察编号而不是按 date
。
data have2;
set have;
_ID_ = _N_;
run;
第 3 步:运行 proc expand
按区域进行 lead
转换
lead
会像听起来一样。只要数据支持,您可以根据需要使用任意多个值。在这种情况下,我们以一项观察领先。
proc expand data=have2
out=want;
by Region;
id _ID_;
convert Price = Lead_Price / transform=(lead 1) ;
run;
尝试按您想要铅价的变量排序,然后一起设置两次:
data test;
length Date Region Price 8 ;
input Date $ Region $ Price ;
datalines;
01-03 A 1
01-03 A 2
01-03 B 3
01-03 B 4
01-03 A 5
01-04 B 4
01-04 B 6
01-04 B 7
;
run;
** sort by vars you want lead price for **;
proc sort data = test;
by DATE REGION;
run;
** set together twice -- once for lead price and once for all variables **;
data lead_price;
set test;
by DATE REGION;
set test (firstobs = 2 keep = PRICE rename = (PRICE = LEAD_PRICE))
test (obs = 1 drop = _ALL_);
if last.DATE or last.REGION then do;
LEAD_PRICE = .;
end;
run;
假设数据集有三列
Date Region Price
01-03 A 1
01-03 A 2
01-03 B 3
01-03 B 4
01-03 A 5
01-04 B 4
01-04 B 6
01-04 B 7
我尝试通过以下代码按日期和地区获取铅价。
data want;
set have;
by _ric date_l_;
do until (eof);
set have(firstobs=2 keep=price rename=(price=lagprice)) end=eof;
end;
if last.date_l_ then call missing(lagprice);
run;
然而,WANT只有一个观察结果。然后我创建 new_date=date
并尝试另一个代码:
data want;
set have nobs=nobs;
do _i = _n_ to nobs until (new_date ne Date);
if eof1=0 then
set have (firstobs=2 keep=price rename=(price=leadprice)) end=eof1;
else leadprice=.;
end;
run;
使用这段代码,SAS 运行缓慢。所以我觉得这段代码也不合适。任何人都可以提出一些建议吗?谢谢
您可以使用 proc expand
按组生成数字变量的潜在客户。请尝试以下方法:
第 1 步:按地区、日期排序
proc sort data=have;
by Region Date;
run;
第 2 步:创建一个新的 ID 变量来表示观测值
因为每个地区的每个日期都有多个值,我们需要生成一个新的 ID 变量,以便 proc expand
使用 lead
按观察编号而不是按 date
。
data have2;
set have;
_ID_ = _N_;
run;
第 3 步:运行 proc expand
按区域进行 lead
转换
lead
会像听起来一样。只要数据支持,您可以根据需要使用任意多个值。在这种情况下,我们以一项观察领先。
proc expand data=have2
out=want;
by Region;
id _ID_;
convert Price = Lead_Price / transform=(lead 1) ;
run;
尝试按您想要铅价的变量排序,然后一起设置两次:
data test;
length Date Region Price 8 ;
input Date $ Region $ Price ;
datalines;
01-03 A 1
01-03 A 2
01-03 B 3
01-03 B 4
01-03 A 5
01-04 B 4
01-04 B 6
01-04 B 7
;
run;
** sort by vars you want lead price for **;
proc sort data = test;
by DATE REGION;
run;
** set together twice -- once for lead price and once for all variables **;
data lead_price;
set test;
by DATE REGION;
set test (firstobs = 2 keep = PRICE rename = (PRICE = LEAD_PRICE))
test (obs = 1 drop = _ALL_);
if last.DATE or last.REGION then do;
LEAD_PRICE = .;
end;
run;