我对 SAS 的世界很陌生,因此非常新鲜,虽然我去年在学习期间使用过 SAS,但理论知识与实践知识并不相同。
这是我的问题。
我有 SAS 表格,如下例所示:
table1
date var_1 var_2 var_3 var_4 var_5
1957M1 . . . . .
1957M2 . . . . 23.5
1957M3 . 1.2 . . 23.6
1957M4 . 1.3 . . 23.7
1957M5 . 1.4 . 0.123 23.8
1957M6 . 1.5 . 0.124 23.9
1957M7 . 1.6 3.0 0.125 23.10
1957M8 . 1.7 3.1 0.126 23.11
1957M9 . 1.8 3.2 0.127 23.12
1957M10 2.1 1.9 3.3 0.128 23.13
1957M11 2.2 1.10 3.4 0.129 23.14
1957M12 2.3 1.11 3.5 0.130 23.15
正如您所猜测的,每个变量本身就是一个时间序列,日期也是一个时间序列。除了日期列之外,其他列都是数字列,日期列是字符列。
我的目标是了解每个变量、它们各自的开始日期和最晚日期。
var_1 将从 1957 年 10 月(或 M10)开始,最晚日期为 1957 年 12 月(或 M12)。
var_4 将于 1957 年 10 月(或 M10)开始,最晚日期为 12 月(或 M12)。
我已经通过 SAS 对一张表的一列尝试了以下操作作为测试,但花了很长时间,没有结果。
PROC SQL NOPRINT;
SELECT
MIN(input(substr(date,1,4),date4.)),
MAX(input(substr(date,1,4),date4.))
FROM
table1
WHERE
var_2 <> "."
quit;
对于我的查询,日期列是文本形式的。我正在尝试通过我的查询将其转换为仅包含年份的日期格式,尽管我只会使用年份,并且拥有月份会很棒。
我的老板告诉我使用 PROC FREQ
来实现我想要的结果,但我不知道如何实现。
如果你有任何线索,我会接受。
干杯。
最佳答案
您的问题是您的数据结构并不真正适合您的问题。
正确的数据结构是更垂直的结构,有DATE、VAR、VALUE。那么 PROC MEANS
非常适合您的需求。
data have;
input date $ var_1 var_2 var_3 var_4 var_5;
datalines;
1957M1 . . . . .
1957M2 . . . . 23.5
1957M3 . 1.2 . . 23.6
1957M4 . 1.3 . . 23.7
1957M5 . 1.4 . 0.123 23.8
1957M6 . 1.5 . 0.124 23.9
1957M7 . 1.6 3.0 0.125 23.10
1957M8 . 1.7 3.1 0.126 23.11
1957M9 . 1.8 3.2 0.127 23.12
1957M10 2.1 1.9 3.3 0.128 23.13
1957M11 2.2 1.10 3.4 0.129 23.14
1957M12 2.3 1.11 3.5 0.130 23.15
;;;;
run;
data want;
set have;
array var_[5];
date_num = mdy(substr(date,6),1,substr(date,1,4));
do _iter= 1 to dim(var_);
if not missing(var_[_iter]) then do;
var = vname(var_[_iter]);
value = var_[_iter];
output;
end;
end;
format date_num MONYY.;
run;
proc means data=want;
class var;
var date_num;
output out=edge_dates min= max= /autoname;
run;
关于sas - 了解 SAS 上表的开始日期和最晚日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23343437/