2013-04-23 18 views
5

W jaki sposób można utworzyć zestaw danych SAS z innego zestawu danych przy użyciu tylko ostatnich n obserwacji z oryginalnego zestawu danych. Jest to łatwe, gdy znasz wartość n. Jeśli nie wiem "n", jak to zrobić?SAS - Jak uzyskać ostatnie "n" obserwacji z zestawu danych?

+1

Co masz na myśli mówiąc "nie"? Jak poznasz wartość "n" - czy jest to zmienna zbioru danych, zmienna makro, parametr? – Joe

Odpowiedz

8

Zakłada to, że posiadasz zmienną makro, która określa, ile obserwacji chcesz wykonać. NOBS informuje cię o liczbie obserwacji w zbiorze danych bez czytania całej treści.

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

Korzystanie przykład Joe zmiennej makro, aby określić liczbę obserwacji chcesz, tutaj jest inna odpowiedź:

%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; 

ten powinien wykonać lepiej, gdyż tylko czyta konkretne obserwacje chcesz.

+0

Jestem ciekawy warunków, w których "to powinno działać lepiej". Podejrzewam, że niektóre z nich; dostęp losowy nie jest tak szybki, jak dostęp sekwencyjny, więc istnieje pewna strata. Może przetestować, jeśli mam trochę czasu. Podejrzewam, że jeśli korzystasz z większości obserwacji, że będzie to szybsze, wykonaj to sekwencyjnie, ale jeśli jest to duży zbiór danych i chcesz niewielkiej liczby obserwacji, to szybciej to zrobić losowo = dostęp. Chciałbym, żeby SAS miał sposób na otwarcie zestawu danych w odwrotnej kolejności, bez konieczności uprzedniego sortowania. – Joe

+3

@Joe Wyobraź sobie zbiór danych z 1 milionem obs, a chcesz "ostatni" 10. Korzystając z tej techniki, wykonywanych jest tylko 10 operacji "wprowadzania". Używanie tylko wartości NOBS wymaga 1 miliona operacji "wprowadzania". W zależności od tego, jak "szeroki" jest zbiór danych, różnica ta może być bardzo znacząca. – BellevueBob

+1

Racja, na pewno widzę, że jest to szybsze. Jestem ciekawy, w którym momencie jest on szybszy/wolniejszy (tj. Jaki rozmiar zbioru danych, jaki% danych jest pobierany - 10 z 1MM oczywiście byłoby szybsze, ale co z 500k od 1MM?) – Joe

1

Dla odmiany, oto kolejny podejście (niekoniecznie lepszego)

%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

Uwaga: chcesz określić formatuj, gdy używasz select..into, w przeciwnym razie wartość jest sformatowana jako BEST8., co prowadzi do dziwnych błędów po wybraniu wartości> = 100 000 000 (jest sformatowany w notacji wykładniczej, co prowadzi do zaokrąglenia). – Nickolay

2

Jeśli zestaw danych jest duża, możesz nie chcieć, aby przeczytać cały zestaw danych. Zamiast tego możesz wypróbować konstrukcję, która najpierw odczyta całkowitą liczbę obserwacji w zbiorze danych. Więc jeśli chcesz mieć ostatnie spostrzeżenia:

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; 
Powiązane problemy