【问题标题】:SAS Create column of Re-indexed month values based on macro value 12 months backSAS 根据 12 个月前的宏值创建重新索引月份值的列
【发布时间】:2017-05-05 01:12:50
【问题描述】:

我有一些代码,我每个月都会更新一些代码,用于计算过去 12 个月的一些不同货运组(例如飞机、火车、卡车、轮船等)的货运数据的一些统计数据。

简而言之,我有一个名为发货日期的列,它跨越大约 10 万行并重复指定月份的值 1-12,另一个名为发货计数的列给出了该日期的发货数量,如下所示:

data shipments
  input Shipment_Month Shipment Count;
datalines;
1 2
2 3
3 5
4 6
5 7
6 9
7 10
8 11
9 12
10 11
11 8
12 7
1 .
2 .
3 .
4 .
. .
. .
. .
. .
. .

每次我运行代码时,都会更新两个宏变量,分别是上个月的月底和 12 个月前的月初(跨越 12 个月)。我想做的只是创建一个名为 Shipment_reindex 的列,该列由 Shipment_Month 列中的重新索引值 1-12 填充,宏的值给了我 12 个月的时间,即 month(&Back_12_Months) = 5 rei-indexed to 1 依此类推,即 5=1, 6=2, 7=3, 8=4, 9=5, 10=6, 11=7, 12=8, 1=9, 2=10, 3=11, 4 =12。

Shipment_Month Shipment_Count Shipment_reindex
    1              2                  9
    2              3                 10
    3              5                 11
    4              6                 12              
    5              7                  1
    6              9                  2
    7             10                  3
    8             11                  4
    9             12                  5
   10             11                  6
   11              8                  7
   12              7                  8
   1               .                  9
   2               .                 10
   3               .                 11
   4               .                 12
   5               .                  1
   .               .

我能想到很难做到的方法:

if Shipment_Month=5 then shipment_Reindex=1;
else if Shipment=6 then Shipment_Reindex=2
....

但我希望它在我运行代码时自动更新列,而不是我不断地更改值。我一直在搞乱数组,但进展不快。

请帮帮我!

谢谢, - 基思

【问题讨论】:

  • 对不起,蒂姆,我的错……我不小心在上面附加了 mysql 标签。我正在使用 SAS 9.4。不过还是谢谢!!!

标签: indexing macros sas reindex


【解决方案1】:

这个问题可以通过简单的代数标准来解决。 您可以在此步骤中更改您想要开始月份的值call symputx("Back_12_Months",5)

data shipments;
input Shipment_Month Shipment_Count;
datalines;
1 2
2 3
3 5
4 6
5 7
6 9
7 10
8 11
9 12
10 11
11 8
12 7
1 .
2 .
3 .
4 .
5 .
6 .
7 .
;
run;

data shipments1;
set shipments;
call symputx("Back_12_Months",5);
if Shipment_Month >= &Back_12_Months. 
   then Shipment_reindex = Shipment_Month+1-&Back_12_Months. ;
else Shipment_reindex = Shipment_Month+13-&Back_12_Months.;
run; 

我的输出:

Shipment_Month  |   Shipment_Count  |   Shipment_reindex
1               |   2               |   9
2               |   3               |   10
3               |   5               |   11
4               |   6               |   12
5               |   7               |   1
6               |   9               |   2
7               |   10              |   3
8               |   11              |   4
9               |   12              |   5
10              |   11              |   6
11              |   8               |   7
12              |   7               |   8
1               |   .               |   9
2               |   .               |   10
3               |   .               |   11
4               |   .               |   12
5               |   .               |   1
6               |   .               |   2
7               |   .               |   3

如有任何疑问,请告诉我。

【讨论】:

  • 谢谢@Keith。乐于助人:)
  • 另外,如果答案对你有帮助,请接受并 UV 答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2023-03-03
  • 2018-11-17
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多