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?
Odpowiedz
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;
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.
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
@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
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
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;
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
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;
Co masz na myśli mówiąc "nie"? Jak poznasz wartość "n" - czy jest to zmienna zbioru danych, zmienna makro, parametr? – Joe