2013-05-07 29 views
5

Tôi đang sử dụng một tập dữ liệu đó là một cái gì đó như:Điền các giá trị trống của một biến với giá trị trước đó không trống SAS 9,3

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
| sexe  | men | 10 | 
|   | female | 20 | 
| age  | 0-20 |  5 | 
|   | 20-40 |  5 | 
|   | 40-60 | 10 | 
|   | >60 | 10 | 
+----------+--------+-------+ 

Và tôi muốn hoàn thành các tế bào "trống" bằng cách sử dụng trước ô không trống để có được một cái gì đó như thế này.

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
| sexe  | men | 10 | 
| sexe  | female | 20 | 
| age  | 0-20 |  5 | 
| age  | 20-40 |  5 | 
| age  | 40-60 | 10 | 
| age  | >60 | 10 | 
+----------+--------+-------+ 

Tôi đã thử nhiều khả năng trong bước DATA chủ yếu với chức năng LAG(). Ý tưởng là đọc hàng trước đó khi ô trống và điền vào đó.

DATA test; 
    SET test; 

    IF variable = . THEN DO; 
     variable = LAG1(variable); 
    END; 
RUN; 

Và tôi đắc

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
|   | men | 10 | 
| sexe  | female | 20 | 
|   | 0-20 |  5 | 
| age  | 20-40 |  5 | 
|   | 40-60 | 10 | 
|   | >60 | 10 | 
+----------+--------+-------+ 

Vấn đề là chuỗi tốt không phải lúc nào cũng chỉ là một hàng trên. Nhưng tôi không hiểu tại sao SAS lại để trống ở hàng đầu tiên và 3d. Nó không phải sửa đổi dòng này bởi vì tôi đã nói "Nếu biến =.". Tôi biết làm thế nào để làm điều này trong Python hoặc trong R với một số cho vòng lặp nhưng tôi đã không tìm thấy giải pháp tốt trong SAS.

Tôi đã cố gắng để đặt chuỗi bên trong một biến với "CALL SYMPUT" và cũng với "RETAIN" nhưng nó cũng không hoạt động.

Phải có cách đơn giản và thanh lịch để thực hiện việc này. Bất kỳ ý tưởng?

+0

Câu hỏi hữu ích. Cảm ơn rất nhiều. – stan

Trả lời

18

Bạn không thể sử dụng LAG bên trong IF và nhận được kết quả đó - LAG không thực sự hoạt động theo cách bạn nghĩ. RETAIN là cách chính xác tôi muốn nói:

DATA test; 
    SET test; 
    retain _variable; 
    if not missing(variable) then _variable=variable; 
    else variable=_variable; 
    drop _variable; 
RUN; 

Trễ không thực sự đi đến kỷ lục trước đó và nhận được giá trị của nó; những gì nó làm là thiết lập một hàng đợi, và mỗi lần LAG được gọi là nó lấy ra một bản ghi từ phía trước và thêm một bản ghi vào mặt sau. Điều này có nghĩa rằng nếu LAG ở trong một khối điều kiện, nó sẽ không thực thi cho điều kiện giả, và bạn không nhận được hàng đợi của bạn. Bạn có thể sử dụng các hàm IFN và IFC, đánh giá cả hai điều kiện đúng và sai bất kể boolean, nhưng trong trường hợp này RETAIN có lẽ dễ dàng hơn.

+0

Làm việc hoàn hảo và giải thích rất rõ ràng! Cảm ơn bạn rất nhiều Joe! Đây là lần thứ hai bạn giúp tôi và nhanh như vậy. Bạn đang làm điều đó như thế nào? Theo dõi tất cả các câu hỏi của RSS? – jomuller

+0

RSS thực sự khá chậm để cập nhật (nhưng, có, trong một số trường hợp); bạn vừa tình cờ hỏi nó ngay sau khi tôi trả lời một câu hỏi khác :) – Joe

+0

Câu trả lời hữu ích. Cảm ơn rất nhiều. – stan

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