我正在尝试根据ID和Date获取默认变量的更改计数。我使用SAS一周大,因此如果需要详细说明,请原谅。
我目前有
data test111;
input Date $ Acc $ Default $;
datalines;
jan-10 A N
feb-10 A D
mar-10 A D
apr-10 A D
may-10 A D
jan-10 B N
feb-10 B N
mar-10 B D
apr-10 B D
may-10 B D
jan-10 C N
feb-10 C N
mar-10 C N
apr-10 C D
may-10 C D
jan-10 D N
feb-10 D D
mar-10 D N
apr-10 D D
may-10 D D
jan-10 E D
feb-10 E D
mar-10 E D
apr-10 E N
may-10 E D
我想要一个输出(下面的表1),该输出在每个唯一帐户的默认值从 N更改为D 时进行计数。但这取决于日期。我只知道如何使用Excel来显示所需的输出(手动计数)。表2是在我不清楚的情况下如何计算帐户的信息。
Table 1
month+1 month+2 month+3 month+4
Jan-10 2 1 1 0
Feb-10 1 1 0
Mar-10 2 0
Apr-10 1
Table 2 (FYR)
month+1 month+2 month+3 month+4
Jan-10 A,D B C -
Feb-10 B C -
Mar-10 C,D -
Apr-10 E
我尝试过类似创建一个新列的操作,当N更改为D时,它会进行标记,这样我就可以在标记= 1时求和
by first.Acc
if first.Acc then tag = 0;
if default = 'D' then do;
tag = 1;
tag+1;
不确定这是否能为我的第一行得到正确的结果。 但是,如果这行得通,它只能给我所需输出的第一行。我有100多个月,可以循环或排列吗?
万一我的SAS数据输入技能失败了,我会随附Excel屏幕截图。 Excel screenshot
答案 0 :(得分:0)
最通用的解决方案是在每个组中进行完全外部联接。
对于默认值为N的月份,SQL可以执行连接并计算相隔月份的月份,默认情况下为D的下一最早月份。制表可以显示计数网格。
数据
将月份字符串转换为格式为yymon
的SAS每月1号日期值,以用于显示。
data have;
input Date $ Acc $ Default $;
month = input ('01-'||date, date9.);
format month yymon.;
datalines;
jan-10 A N
feb-10 A D
mar-10 A D
apr-10 A D
may-10 A D
jan-10 B N
feb-10 B N
mar-10 B D
apr-10 B D
may-10 B D
jan-10 C N
feb-10 C N
mar-10 C N
apr-10 C D
may-10 C D
jan-10 D N
feb-10 D D
mar-10 D N
apr-10 D D
may-10 D D
jan-10 E D
feb-10 E D
mar-10 E D
apr-10 E N
may-10 E D
run;
示例SQL
proc sql;
create view have_v as
select
left.acc
, left.month as from_month
, right.month as to_month
, intck ('MONTH', left.month, right.month) as months_apart
from
have as left
join have as right on left.acc = right.acc
where
left.month < right.month
& left.default = 'N'
& right.default = 'D'
group by left.acc, left.month
having right.month = min(right.month)
order by
left.month, right.month
;
create table grid_bounds as
select
min(from_month) as min_from
, max(from_month) as max_from
, 1 as min_apart
, max(months_apart) as max_apart
from have_v
;
已解释SQL
自我联接是表与其自身的联接。
have as left join have as right
加入约束将from/to
月份组合限制为仅同一帐户中的月份组合
on left.acc = right.acc
where约束进一步将from/to
组合限制为将来仅具有to
且具有所需的default
过渡的组合
where
left.month < right.month
& left.default = 'N'
& right.default = 'D'
group by
运算符和SAS Proc SQL
having
子句自动重合并功能允许使用简单的语句为给定的to
选择最早的from
group by left.acc, left.month
having right.month = min(right.month)
对于连接的选定行,可以使用SAS数据函数INTCK
计算相隔的月份(我认为函数名称是短语“时期的整数”的缩写)
, intck ('MONTH', left.month, right.month) as months_apart
如果已知最大的组大小,则特定的解决方案可以使用数组。
统计输出
由于没有过渡,某些月份可能不存在。同样,也可能不存在一些差距。这些情况在have_v
中将没有任何行。为了获得报告的完整报道,会生成所有可能的交叉(或组合),以用于Proc TABULATE
proc sql;
create table grid_bounds as
select
min(from_month) as min_from
, max(from_month) as max_from
, 1 as min_apart
, max(months_apart) as max_apart
from have_v
;
quit;
data grid (label="All crossings to be shown in the output");
set grid_bounds;
do from_month = min_from to max_from;
do months_apart = 1 to max(12,max_apart);
OUTPUT;
end;
end;
keep from_month months_apart;
format from_month yymon.;
run;
输出一个网格报告,其中包含每个from_month的间隔频率
options missing = '0' nocenter;
title "Account frequency";
title2 "Gap of month default changing from N to D";
proc tabulate data=have_v classdata=grid;
class from_month months_apart;
table
from_month=''
, months_apart * N=''
;
run;
options missing = '.';