【发布时间】:2019-06-27 16:00:39
【问题描述】:
所以我有一个名为 table1 的数据如下:
Obs ID M_201812 M_201901 M_201902 M_201903
1 X1 1 . . .
2 X2 1 1 . .
3 X3 . 1 1 .
4 X4 . 1 . .
5 X5 . 1 . .
6 X6 1 . . .
7 X7 1 1 . .
8 X8 1 1 . .
9 X9 . . 1 .
10 X10 1 1 . .
这里的每一列都是一个月,是根据之前运行的某个宏动态生成的。月份将是动态的并且会有所不同。我需要做的是计算过去 3 个月、过去 6 个月和过去 12 个月的总和。我想到的方法如下: A) 将列名存储在宏变量中:
proc sql noprint;
select distinct name
into :cols2 separated by ','
from dictionary.columns
where upcase(memname) = 'Table1' and name not in ('ID');
;
quit;
%put &cols2.
输出如下:
M_201812,M_201901,M_201902,M_201903
B) 此后根据变量中的项目数创建总和:
data table1;
set table1;
if count("&cols2",",") <=3 then do;
3m_total=sum(of &cols2);
6m_total=sum(of &cols2);
12m_total=sum(of &cols2);
end;
else if 3< count("&cols2",",") <=6 then do;
3m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)));
6m_total=sum(of &cols2);
12m_total=sum(of &cols2);
end;
else if 6< count("&cols2",",") <=12 then do;
3m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)));
6m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)),%scan(%superQ(cols2),-4,%str(,)),%scan(%superQ(cols2),-5,%str(,)),%scan(%superQ(cols2),-6,%str(,)));
12m_total=sum(of &cols2);
else do;
3m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)));
6m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)),%scan(%superQ(cols2),-4,%str(,)),%scan(%superQ(cols2),-5,%str(,)),%scan(%superQ(cols2),-6,%str(,)));
12m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)),%scan(%superQ(cols2),-4,%str(,)),%scan(%superQ(cols2),-5,%str(,)),%scan(%superQ(cols2),-6,%str(,)),
%scan(%superQ(cols2),-7,%str(,)),%scan(%superQ(cols2),-8,%str(,)),%scan(%superQ(cols2),-9,%str(,)),%scan(%superQ(cols2),-10,%str(,)),%scan(%superQ(cols2),-11,%str(,)),%scan(%superQ(cols2),-12,%str(,)));
end;
run;
基本上,只有当有 12 个每月列可用时,我们才会得到 12 个月的总和。如果只有 3 个月可用,则 3months sum=6months sum=12months sum。运行代码后出现如下错误:
ERROR 159-185: Null parameters for SUM are invalid.
这发生在最后一个 else do 语句中。我一生都无法弄清楚为什么 sas 不能阅读一个简单的 if-then-do-else 语句。 if 条件或调用宏变量是否有错误?这里的任何帮助将不胜感激。非常感谢。
【问题讨论】:
-
你从那个结构开始有什么原因吗?你不能从垂直结构开始,其中日期是变量的值而不是变量的名称?
-
呼应@Tom,这是一个报告结构,不是维护或计算数据的好结构。可以做到,但很痛苦。
-
呼应@Reeza,具体来说,您应该使用 MM/YYY 列保持数据较长而不是宽,这对几乎任何分析都有很大帮助。见
proc transpose。
标签: if-statement sas sas-macro datastep