【问题标题】:SAS Do Loop: How to refer to an outside cell valueSAS Do Loop:如何引用外部单元格值
【发布时间】:2013-09-02 23:45:41
【问题描述】:

关于 SAS 中的 Do Loops,我有两个问题。 假设我有三个数据集: (1) 一个数据集,称为last,其中一个观察称为last_observation

last_observation
150

(2) 具有两列观察的第二个数据集:

Time    ID
34200   1
34201   2
34210   3
34213   4
.       .
.       .
.       .
36000   150

请注意,我的时间增量随机增加并且有 925 个观察值。在我的 1X1 数据集中找到相同的数字 (1)。

(3) 第三个数据集have 有两列观察结果:

Purchases_unit Time
1000           34200
2000           34210
1243           34211
3040           34300
.              .
.              .
1000           36000

我想做的是:

data _null_;
set last;
where last=last;
call symput('last_obs',last);run;

%Do i=1 to &'last_obs'; *Hence a loop for 1 to 150 IDs

data want_&i;
set have;
if time<time(i) then delete;
run;  
%end;
%mend;

time(i) 指的是第二个数据集中的时间列,(i) 是时间列的单元格下标。所以我的两个问题是:

(1) 这行得通吗?:%Do i=1 to &amp;'last_obs'; 如果我使用 symput 函数? (2) 如何实现time(i) 索引?

【问题讨论】:

    标签: sas do-loops


    【解决方案1】:

    我会使用一个哈希对象来查找你想要的值。

    data last;
    last_observation= 4;
    call symput("last",last_observation);
    run;
    
    data time_id;
    input Time    ID;
    datalines;
    34200   1
    34201   2
    34210   3
    34213   4
    ;;;
    run;
    
    data purchases;
    input Purchases_unit Time;
    datalines;
    1000           34200
    2000           34210
    1243           34211
    3040           34300
    ;;;
    run;
    
    %macro loopit(n);
    %do i=1 %to &n;
    data want_&i(drop=rc);
    set purchases;
    format time_i best.;
    retain time_i id;
    if _n_ = 1 then do;
        declare hash lookup(dataset:"time_id(rename=(time=time_i))");
        rc = lookup.definekey("id");
        rc = lookup.definedata("time_i");
        rc = lookup.definedone();
    
        id = &i;
    
        rc = lookup.find();
    end;
    
    if time >= time_i;
    run;
    %end;
    %mend;
    
    %loopit(&last);
    

    在第一次观察中,您从查找表中查找值。保留该值并使用子集 if 语句。

    【讨论】:

    • 太棒了!感谢这个哈希码。这将是我第一次实现哈希对象。
    • 我还有一个问题,如何在哈希对象中包含额外的IF 语句?例如,在if time &gt;= time_i; 旁边,我想包括if time=0,因此大于或等于time_itime=0 的观察值。我该怎么做?我尝试简单地添加if time=0,但我的观察结果为零,这是因为我不能同时拥有time=0 time&gt;=time_i 进行一次观察。
    • try if time&gt;=time_i or time=0; if 语句的子集保留所有评估为 TRUE 的值。只需在此处添加任何其他条件。你可以回到你的“if then delete;”也是。
    • 啊,我明白了我在实现代码时的错误在哪里。再次非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多