sas - 了解 SAS 上表的开始日期和最晚日期

标签 sas

我对 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/

相关文章:

r - 嵌套 ifelse 语句

sas - 将日期时间转换为 proc-sql sas 中的日期

bash - 像在 SAS 中一样加入 bash

java - 我怎样才能在 SAS 9.4 中获得像 OLAPDataSetInterface 这样的对象

sas - 如何根据组内的观察(行)数删除观察?

oracle - 在 UTF-8 session 中从 SAS 读取 Oracle 数据 - 字符丢失重音

VBA - 打开Excel,查找和替换,删除行,另存为csv

sql - SAS/SQL 按多列聚合

java - PC SAS 和服务器 SAS 之间的区别

r - 统计包中 "The grammar of graphics"的实现