2014-12-15 11 views
5

Tôi luôn luôn nghĩ rằng các biến được đặt thành thiếu cho mỗi lần lặp lại của bước dữ liệu. Tuy nhiên, trong đoạn mã sau, nó trông giống như giá trị mà biến được giữ ngay từ đầu. Tôi không thể hiểu tại sao điều này xảy ra?SAS. Các biến có được đặt thành thiếu ở mọi lần lặp lại của bước dữ liệu không?

data one; 
input x $ y; 
datalines; 
a 10 
a 13 
a 14 
b 9 
; 
run; 

data two; 
input z; 
datalines; 
45 
; 
run; 

data test; 
if _n_ = 1 then set two; /* when _n_=2 the PDV assigns missing values, right ? */ 
set one; 
run; 
proc print; 
run; 

Kết quả là

z  x  y 
    45  a 10 
    45  a 13 
    45  a 14 
    45  b  9 

Tôi đã chờ đợi để có được điều này

z  x  y 
    45  a 10 
    .  a 13 
    .  a 14 
    .  b  9 

Trả lời

3

SAS không không thiết lập lại giá trị trong PDV cho - SET, MERGE, sửa đổi, hoặc UPDATE các câu lệnh. Vì bạn đang sử dụng câu lệnh SET nên SAS không đặt lại nó.

if _n_ = 1 then set two; 

http://support.sas.com/documentation/cdl/en/lrcon/65287/HTML/default/viewer.htm#p08a4x7h9mkwqvn16jg3xqwfxful.htm

đọc - Giai đoạn Thực hiện - Pointer 5

http://support.sas.com/documentation/cdl/en/basess/58133/HTML/default/viewer.htm#a001290590.htm

http://support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default/viewer.htm#a000961108.htm

+0

OK tôi hiểu rồi. SAS sẽ không thiết lập lại một giá trị biến để thiếu UNLESS nó sắp đọc trong một kỷ lục mới. Cảm ơn bạn – Elvis

+0

http://support.sas.com/documentation/cdl/en/lrcon/65287/HTML/default/viewer.htm#p08a4x7h9mkwqvn16jg3xqwfxful.htm – NEOmen

+0

(Nhận xét liên quan đến phiên bản trả lời trước đã bị xóa.) – Joe

1

SAS đặt một lá cờ cho mỗi biến trong PDV, mà quy định cụ thể điều gì sẽ xảy ra với nó khi bước dữ liệu trở về đầu của vòng lặp. Cờ này cho biết rằng một biến sẽ được đặt lại thành thiếu hoặc không được đặt lại thành thiếu (và sẽ giữ lại là giá trị hiện tại).

Theo mặc định, cờ này cho biết rằng một biến phải được đặt lại. Cờ này thường được đặt thành 'giữ lại giá trị' theo một trong hai cách.

  • Đầu tiên, nếu một biến hiện diện trong một tuyên bố duy trì hoặc có hành SUM sử dụng với nó ở phía bên trái (x+1;), cờ được thiết lập cho biến đó.
  • Thứ hai, nếu biến có mặt trên câu hỏi set, merge, 'sửa đổi' hoặc update, cờ được đặt cho biến đó.

Trong trường hợp này, biến số z của bạn có trên tuyên bố set, vì vậy nó sẽ tự động được giữ lại.

Đây là một ví dụ điển hình khác về hoạt động này.

data test1; 
do x=1 to 5; 
    y=2; 
    output; 
end; 
run; 

data test2; 
    do x=6 to 10; 
    output; 
    end; 
run; 

data test3; 
    set test1 test2; 
    if x=7 then y=4; 
run; 

Ở đây, y sẽ được thiết lập để mất tích sau khi kỷ lục cuối cùng của test1 được đọc; đó là do vào cuối nhóm hoặc theo tập dữ liệu, nó đặt tất cả các biến mất tích sau khi. Tuy nhiên, y vẫn tự động được giữ lại; lá cờ đó không phải là thứ có thể thay đổi. Vì vậy, khi tôi đặt y=4; trên bản ghi x=7, số 4 đó được giữ lại trong suốt. Vì vậy, x=6 có thiếu y nhưng x=7 thông qua x=10y=4.

Nhưng hãy chờ, bạn nói.Các biến của tôi xy cũng có trong tuyên bố set và chúng không tự động được giữ lại. Chúng được đặt lại mỗi khi bước dữ liệu đọc từ tập dữ liệu.

Không. Chúng được đặt thành một giá trị mới, vâng: nhưng chúng chưa bao giờ bị thiếu. Điều này có liên quan đặc biệt trong một vài trường hợp: nhiều đến một sự hợp nhất, về cơ bản hoạt động như trên, nhưng với các nhóm by: bản ghi one được hợp nhất vào tất cả các many, không phải vì nó được đọc nhiều lần, nhưng vì nó đọc trong một lần và sau đó không được đặt lại thành thiếu (ví dụ: được giữ lại). Đây là lý do tại sao một nhiều để một phần hợp nhất là một chút nguy hiểm nếu bạn không biết về điều này:

data test1; 
    do x=1 to 5; 
    z=0; 
    output; 
    end; 
run; 

data test2; 
    do x=1 to 5; 
    do y=1 to 3; 
     output; 
    end; 
    end; 
run; 

data testMerge; 
    merge test1 test2; 
    by x; 
    if y=2 then z=1; 
run; 

ý rằng z=1 là đúng đối với y=2 cho y=3 hồ sơ, mặc dù tôi đã không yêu cầu cái đó! Rất tiếc! Đó là vì z được đọc từ test1 một lần cho lần đầu tiên của mỗi x theo hồ sơ nhóm và sau đó không được đọc lại sau đó - chỉ được giữ lại.

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