【问题标题】:SAS - how to extract multiple datasets based on a dynamic date variable in another dataset?SAS - 如何根据另一个数据集中的动态日期变量提取多个数据集?
【发布时间】:2017-07-17 08:02:49
【问题描述】:

我有一个主数据集 A:

Var1   Var2   Var3
X      50     201704
Y      100    201705
Z      150    201704

Var1 - 字符串 Var2 - 数字 Var3 - 日期 yymmn6。

我想从前 3 个月的数据集(类似的 histpry 数据集)中提取所有这些记录的 var2。

比如说,对于 X 和 Z,我需要来自 201703、201702 和 201701 数据集的 var2 变量。对于 Y,我需要来自 201704、201703 和 201702 数据集的 var2。

然后我必须计算每个观察值的所有 var2 的总和。

我相信这是一个 sas 宏的工作。我无法显示我的代码,因为数据要复杂得多。

有人可以帮忙破解一下吗?

【问题讨论】:

  • 您需要展示到目前为止您已经尝试过的内容,并就您遇到问题的某个领域提出具体问题。 VAR3 是字符变量吗?如果是这样,您将需要 INPUT 函数将其转换为日期。然后,您可以使用 INTNX 函数查找 1 个月、2 个月和 3 个月前的适当日期:blogs.sas.com/content/iml/2017/05/15/…
  • 您能详细说明一下吗?您似乎有一个包含 3 个变量的数据集,但第 3 段似乎表明每条 yyyymm 行都指向单个数据集。是哪个?
  • 那么这些其他数据集是什么样的呢?您是如何使用“201704”之类的名称创建它们的,SAS 无法将其用作成员名称?
  • 其他数据集看起来也一样。它只是一种类似格式的月度数据集。 201704 是日期格式 yymmn6。
  • 看起来VAR1是变量名,VAR3是数据集名(或者至少可以转换成数据集名)。但是您发布的示例数据中 VAR2 的目的是什么?您想将该值与从每月数据集中提取的值进行比较吗?

标签: sas-macro


【解决方案1】:

我希望这对第一点有帮助:

data set_A; 
    input Var1 $ Var2 Var3;
    cards;
    X 50 201704 
    Y 100 201705 
    Z 150 201704
    ; 
run;

/我想从过去 3 个月的数据集中提取所有这些记录的 var2。/

data set_A; 
    set set_A; 
    Y=substr( left(var3),1,4);
    M=substr( left(var3),5,2);
    date_var = mdy(M, '01', Y);
run;

data Var2_last3_M;
    set set_A;
    if date_var >= date()-30*3; /*You can use intck function here too*/
    keep = var2;
run;

编辑:根据反馈,这是我想出的:

%macro Get_month_data(year, month);
    data wanted&year._&month.; 
        set set_a;
        if year(date_var)=&year and 
            month(date_var)=&month.; /*adjust as needed see below*/
    run;
%mend Get_month_data;
%Get_month_data(2017,4); /*Apr of 2017 data */
%Get_month_data(2017,5); /*May data*/

既然你说你想要一个月后的数据,逻辑可能是这样的:

(month(date_var)=&month. or month(date_var)=%eval(&month.-1) );

根据需要进行调整。

【讨论】:

  • 总结一下我的查询,我想要从预订之日起过去 4 个月的交易总和。我有每月交易表。由于预订日期是动态的,我发现很难获取交易。希望这可以让您更全面地了解问题。
  • 现在说得通了。解决方案建议:按照我上面的方法生成集合,然后调用执行宏来加载有问题的数据集。明天我会添加一个示例,除非 some1 else 更快。
  • 你好。你能帮我解决这个问题吗?我还没有找到任何解决方案。
猜你喜欢
  • 2011-08-23
  • 2019-06-17
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多