2011-10-11 24 views
5

Một nghi ngờ về SAS:nếu _N_ = 1 điều kiện trả về đúng ngay cả khi các thiết lập bộ dữ liệu rỗng (không quan sát) trong SAS

data new; 
     set _NULL_; 
    run; 

    data _NULL_; 
     set new; 
     if _N_ = 0 then call execute ("%put empty dataset;"); 
     if _N_ = 1 then call execute ("%put non-empty dataset;"); 
    run; 

Các bit trên mã trong hiểu biết của tôi chỉ nên in những nhận xét đầu tiên, nghĩa là tập dữ liệu trống. Đối với một số lý do mặc dù nó là trở lại một sự thật cho thứ hai nếu điều kiện là tốt và in không có bộ dữ liệu không có sản phẩm nào là tốt.

Vui lòng cho tôi biết tôi đang gặp vấn đề gì với điều này?

Trả lời

10

Được rồi, đây là những gì tôi nghĩ đang diễn ra. Vấn đề đầu tiên là các lời gọi macro của bạn nằm trong các dấu ngoặc kép và do đó được xử lý trước bộ xử lý trước khi SAS bắt đầu xử lý bước dữ liệu (thực thi bất kể điều kiện if có đúng hay không). Bạn cần đặt đối số để thực hiện trong các dấu nháy đơn chứ không phải dấu ngoặc kép để giữ cho nó không được thực hiện sớm bởi trình xử lý trước macro.

Mã này vẫn không hoạt động trên tập dữ liệu trống, tuy nhiên, nếu tập dữ liệu được cung cấp trên dòng thiết bị trống thì toàn bộ bước dữ liệu sẽ kết thúc trước khi thực thi thêm bất kỳ mã nào.

Thứ ba, _N_ được khởi tạo 1, không phải 0 và tăng dần từ đó trên ranh giới bước dữ liệu, do đó, điều kiện _N_ = 0 sẽ luôn là sai.

Một cách khác để đi về việc này sẽ được sử dụng Nobs = tùy chọn để thiết lập như sau:

data _NULL_; 
    if 0 then set new nobs=num_obs; 
    if num_obs = 0 then call execute ('%put empty dataset;'); 
    if num_obs > 0 then call execute ('%put non-empty dataset;'); 
stop; 
run; 

Các if 0 then là một điều kiện giả sử dụng để cưỡng chế thi hành của mã bước dữ liệu; nếu một tuyên bố thiết lập trần đã được sử dụng sau đó thực hiện sẽ không tiếp tục quá dòng thiết lập nếu tập dữ liệu "mới" là sản phẩm nào.

Một lựa chọn tốt hơn có thể được sử dụng macro để mở các tập dữ liệu và đọc bất kỳ thuộc tính:

%let dsid = %sysfunc (open(dataset_name)); 
%let anyobs = %sysfunc (attrn(&dsid,ANY)); 
%let dsid = %sysfunc (close(&dsid)); 

Biến vĩ mô &anyobs sẽ là 1 nếu dataset_name chứa ít nhất một quan sát (hàng) và ít nhất một biến (cột), 0 nếu nó không chứa các quan sát nhưng có ít nhất một biến và -1 nếu nó không chứa các quan sát và không có biến nào.

+0

Cảm ơn Gary! Câu trả lời của bạn thực sự hữu ích. –

+0

Câu trả lời toàn diện hay –

Các vấn đề liên quan