【问题标题】:How to put a n+1 value from a variable into another column at row n in case of multiple rows per ID in SAS?如果 SAS 中每个 ID 有多行,如何将变量中的 n+1 值放入第 n 行的另一列?
【发布时间】:2017-11-18 22:22:21
【问题描述】:

我有一个数据集,其中每个 ID 有多个按日期排序的多行。 我想为每一行拆分我的数据集,并将 n+1 行日期的值放入每个 ID 的 n 行的另一列中。如果 ID 只有一行,则该值已经定义。然后我想将我的数据集拆分为 count=1 然后 count=2 等...我该如何在 SAS 中做到这一点?

   ID   date    end_period      age_end count
   1    n       n+1             value    1
   1    n+1     N+2             value    2
   1    N+2     n+3             value    3
   1    n+3     value(age_end)  value    4
   2    n       value(age_end)  value    1

【问题讨论】:

  • 所以这是一个前瞻问题?你想计算 end_period 吗?我建议您显示您必须开始的数据(使用真实的实际值,而不是 n+1 等,并显示您想要创建的数据。听起来您可能想要创建 end_period 变量,然后创建四个输出数据集?

标签: loops parsing sas do-while


【解决方案1】:

正如 Quentin 所说,如果没有看到一些示例数据,这有点难以判断。我有点理解,就像他们提到的那样,您需要创建 2 个字段。如果你的日期是一个 SAS 日期,并且一个巨大的 IF,那么你可以简单地这样做......

end_period = date + 1;

如果不是,我建议将数字或文本转换为 SAS 日期。

如果 Count 不是数据集中的一个字段,那么简单地排序并按组处理就可以轻松计算出该字段

data dsn_final;
   set dsn_name;
   by ID Date;
   if first.ID then Count=1;
   else Count+1;
run;

最后拆分成单独的数据集。如果存在未知的最大计数...意味着您不知道数据集中任何 ID 的最大行,因为它太大,或者可能发生变化,那么我建议使用宏来创建单独的数据集。首先找到最大值并将其存储在宏变量中。然后根据计数拆分数据集,直到最大计数。

proc sql noprint;
    select max(count)
           into: max_count
    from simulate;
quit;

%put &max_count.;

%macro datasets;
data %do count=1 %to &max_count; 
        date&count. (drop=count) 
    %end; ;
set simulate;
    %do count=1 %to &max_count;
        if count = &count. then output date&count.;
    %end;
run;
%mend;
%datasets;

如果您回复数据样本,那么可能有更简单的方法,但据我了解,您需要计算 2 个字段然后拆分。如果您知道最大值,拆分会更容易。我只会在未知或将来可能使用宏并且数据随着最大计数可能发生变化而变化时才使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多