2013-04-23 38 views
5

Làm cách nào bạn có thể tạo tập dữ liệu SAS từ tập dữ liệu khác chỉ sử dụng các quan sát n cuối cùng từ tập dữ liệu gốc. Điều này rất dễ dàng khi bạn biết giá trị của n. Nếu tôi không biết 'n' làm thế nào điều này có thể được thực hiện?SAS - Làm cách nào để nhận các quan sát 'n' cuối cùng từ tập dữ liệu?

+1

Bạn có ý gì khi không biết 'n'? Làm thế nào bạn sẽ tìm ra giá trị của 'n' - đó là biến số liệu, biến macro, tham số? – Joe

Trả lời

8

Giả sử bạn có biến macro cho biết có bao nhiêu quan sát bạn muốn. NOBS cho bạn biết số quan sát trong tập dữ liệu hiện tại mà không cần đọc toàn bộ.

%let obswant=5; 
data want; 
set sashelp.class nobs=obscount; 
if _n_ gt (obscount-&obswant.); 
run; 
4

Sử dụng ví dụ của một biến vĩ mô của Joe để xác định số lượng các quan sát mà bạn muốn, đây là một câu trả lời:

%let obswant = 10; 
data want; 
    do _i_=nobs-(&obswant-1) to nobs; 
     set have point=_i_ nobs=nobs; 
     output; 
     end; 
    stop; /* Needed to stop data step */ 
run; 

này nên thực hiện tốt hơn vì nó chỉ đọc quan sát cụ thể mà bạn muốn.

+0

Tôi tò mò về các điều kiện cho "điều này sẽ hoạt động tốt hơn". Tôi nghi ngờ đó là một số của mỗi; truy cập ngẫu nhiên không phải là nhanh như truy cập tuần tự, do đó, có một số mất mát ở đó. Có thể kiểm tra nó ra nếu tôi có một thời gian. Tôi nghi ngờ nếu bạn đang sử dụng hầu hết các quan sát rằng nó sẽ được nhanh hơn để làm điều đó tuần tự, nhưng nếu nó là một tập dữ liệu lớn và bạn muốn có một số lượng nhỏ các quan sát nó là nhanh hơn để làm điều đó ngẫu nhiên = truy cập. Làm cho tôi muốn SAS có một cách để mở một tập dữ liệu theo thứ tự ngược lại mà không cần phải sắp xếp nó trước. – Joe

+3

@Joe Hãy tưởng tượng một tập dữ liệu với 1 triệu người bị ám ảnh và bạn muốn "cuối cùng" 10. Sử dụng kỹ thuật này, chỉ có 10 hoạt động "đầu vào" được thực hiện. Chỉ sử dụng giá trị NOBS yêu cầu 1 triệu hoạt động "đầu vào". Tùy thuộc vào cách "rộng" tập dữ liệu, sự khác biệt này có thể rất quan trọng. – BellevueBob

+1

Phải, tôi chắc chắn thấy khả năng này nhanh hơn. Tôi tò mò tại thời điểm đó nó nhanh hơn/chậm hơn (nghĩa là kích thước của tập dữ liệu,% dữ liệu nào được kéo - 10 từ 1MM tất nhiên sẽ nhanh hơn, nhưng khoảng 500k từ 1MM?) – Joe

1

Vì lợi ích của đa dạng, đây là cách tiếp cận khác (không nhất thiết là một tốt hơn)

%let obswant=5; 

proc sql noprint; 
select nlobs-&obswant.+1 into :obscalc 
from dictionary.tables 
where libname='SASHELP' and upcase(memname)='CLASS'; 
quit; 

data want; 
set sashelp.class (firstobs=&obscalc.); 
run; 
+1

Lưu ý: bạn muốn chỉ định định dạng khi sử dụng select..into, nếu không giá trị được định dạng là BEST8., dẫn đến lỗi lạ khi bạn chọn giá trị> = 100.000.000 (được định dạng theo ký hiệu số mũ, dẫn đến làm tròn). – Nickolay

2

Nếu dữ liệu quá lớn, bạn có thể không muốn đọc toàn bộ tập dữ liệu. Thay vào đó, bạn có thể thử một công trình đọc tổng số Quan sát trong tập dữ liệu trước tiên. Vì vậy, nếu bạn muốn có những quan sát cuối cùng:

data t; 
    input x; 
datalines; 
1 
2 
3 
4 
; 

%let dsid=%sysfunc(open(t)); 
%let num=%sysfunc(attrn(&dsid,nlobs)); 
%let rc=%sysfunc(close(&dsid)); 
%let number = 2; 

data tt; 
set t (firstobs = %eval(&num.-&number.+1)); 
run; 
Các vấn đề liên quan