2017-09-17 5 views
1

J'essaie de trouver un moyen d'imprimer seulement les 10 premières et les 10 dernières observations de mon ensemble de données SAS. Y a-t-il un moyen de le faire?Comment imprimer les 10 premières et dernières 10 observations en SAS?

J'ai essayé proc print data = ia.usage; where Obs < 10 & Obs > 80;run; Mais la commande affiche toujours les 90 observations. Une idée sur la façon de le faire facilement?

Merci.

Répondre

4

Obtenir les 10 premiers est facile:

/*First 10 obs*/ 
proc print data = ia.usage(obs = 10); run; 

Tirer le 10 dernier est un peu plus difficile, mais cela peut être fait en utilisant une vue:

/*Last 10 obs*/ 
data last10 /view = last10; 
    startobs = nobs - 9; 
    set ia.usage nobs = nobs firstobs = startobs; 
    drop startobs; 
run; 
proc print data = last10; run; 

Si vous voulez à la fois dans le même proc print, vous pouvez créer deux vues et les combiner dans une autre vue, puis l'imprimer:

data first10 /view = first10; 
    set ia.usage(obs = 10); 
run; 

data first10_last10 /view = first10_last10; 
    set first10 last10; 
run; 

proc print data = first10_last10; run; 

La méthode ci-dessus doit être Ry rapide, même pour les grands ensembles de données, mais il suppose que votre ensemble de données initial n'est pas une vue, car il repose sur la connaissance du nombre de lignes (nobs) dans l'ensemble de données. Si vous avez une vue, vous devrez lire tout le jeu de données pour connaître le nombre de lignes, puis le relire, en jetant tout sauf la première et la dernière rangée. Ce sera beaucoup plus lent. Par exemple.

data first10_last10 /view = first10_last10; 
    do nobs = 1 by 1 until(eof); 
    set ia.usage(drop = _all_) end = eof; /*We only want the row count, so drop all vars on this pass to save a bit of time*/ 
    end; 
    do _n_ = 1 to nobs; 
    set ia.usage; 
    if _n_ <= 10 or _n_ >= nobs - 9 then output; 
    end; 
run; 

proc print data = first10_last10; 
0

Ceci peut être réalisé en utilisant une vue unique:

data want/view=want; 
    set ia.usage nobs=__nobs; 
    if _n_ le 10 or _n_ gt __nobs-10; 
run; 

proc print data=want; 
run; 
+0

Cela peut être lent pour les grands ensembles de données car il implique la lecture de l'ensemble des données plutôt que seulement les 10 premières/dernières lignes. – user667489

+0

oui, d'accord, l'approche que vous avez présentée est plus efficace –