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=10
có y=4
.
Nhưng hãy chờ, bạn nói.Các biến của tôi x
và y
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
và 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.
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
http://support.sas.com/documentation/cdl/en/lrcon/65287/HTML/default/viewer.htm#p08a4x7h9mkwqvn16jg3xqwfxful.htm – NEOmen
(Nhận xét liên quan đến phiên bản trả lời trước đã bị xóa.) – Joe