2011-03-21 19 views
12

Değişkenlerin ismini alabilecek ifadeler var mı? Tercihen bunları başka bir veri kümesinin bir sütununa, bir metin alanına veya bir makro değişkenine koymaya.SAS veri kümesinde değişken adları nasıl okunur?

E.g.

- Veri

Name age sex 

    Jk 14 F 
    FH 34 M 
  • Beklenen veri

Var_name_of_dataset1

Name 
age 
sex 

set set

Not: Bir açıklama biliyorum: hangisini seçiyorsun, uygun bir şekilde Bir sütunun değerini özelleştirilmiş separetor'larla bir alana okuyabilir ve bu nedenle sütun isimlerini bir alana veya sütuna okumak için benzer yollar olmasını isterim.

Teşekkür

cevap

25

PROC İÇERİĞİ Bir veri kümesindeki bu bilgileri almanın en hızlı yolu olacaktır. Sütun adları, NAME sütununda bulunabilir.

proc contents data=sashelp.class out=contents noprint; 
run; 
+0

Çok teşekkürler Laurent! Bu çok kullanışlıdır. CHeers – mj023119

19

Ayrıca datastep ve dizi fonksiyonlarını kullanabilir, örneğin,

 
data colnames ; 
    set sashelp.class (obs=1) ; 

    array n{*} _NUMERIC_ ; 
    array c{*} _CHARACTER_ ; 

    do i = 1 to dim(n) ; 
    vname = vname(n{i}) ; 
    output ; 
    end ; 
    do i = 1 to dim(c) ; 
    vname = vname(c{i}) ; 
    output ; 
    end ; 
run ; 
+4

+1: Bunun muhtemelen en kullanışlı ve esnek yöntem olduğunu düşünüyorum.Veri adımından istediğiniz çıktıyı verebilirsiniz - belirli bir formattaki veri kümesi veya belirli bir stilde makro değişkenlerini ayarlamak için CALL SYMPUT. Diğer bilgileri almak için VLABEL, VFORMAT vb. –

+0

Merhaba Chris, daha sonra yönteminizi deneyeceğim. hepinize teşekkür ederim :) – mj023119

+0

Proc içeriğini biliyorum ama bu çok daha esnek. Çok teşekkürler! – Matt

7
%macro getvars(dsn); 
%global vlist; 
proc sql; 
select name into :vlist separated by ' ' 
    from dictionary.columns 
    where memname=upcase("&dsn"); 
quit; 
%mend; 

Bu bir boşlukla ayrılmış olarak veri kümesindeki tüm değişkenlerin isimlerini içerecek & VLIST adında bir makro değişken oluşturur . Değişken isimler arasında virgül istiyorsanız, yapmanız gereken tek şey 'ayrılan' değeri '' ile ',' arasında değiştirmektir. Durum deyimindeki yönerge işlevinin kullanılması, veri kümesi adını yanlış bir durumda ileten biriyle ilgili sorunları önler. Oluşturulan makro değişkeni, makro olarak tanımlanmaya gerek kalmadan küresel makroyu içermesi gerekeceğinden, global

+0

bir kaç sorun - öncelikle, tüm sözlükleri sorguladığı için sözlük tablosu çok yavaş olabilir. İkincisi, bu kayıt fonksiyonu her kayıtta ateş edecektir.% Upcase daha verimli olacaktır. Son olarak, neden bir makro bile kullanıyor? Bu açık kodda iyi çalışır. –

0

Global sözlük, tablo tablolarının okunmasıyla ilgili olarak Rawfocus'un tüm kitaplıkları sorgulamasının doğru olduğundan emin değilim, örnekte sashelp kullanıldı. Bunun yerine vcolumn doğru olurdu, bu yaklaşım çok yavaş ve tahsis edilen tüm kütüphanelere erişiyor. (Bunu SAS RTRACE sistem seçeneğiyle ispatlayabilirsiniz.)

dictionary.columns için sql sorgusunun burada özetlenen yöntemlerin en hızlısı olduğu kanaatindeyim. Açıkçası, makrolaştırılmış kod, makro olmadan çalışacaktı, ancak makronun amacı, bir yardımcı program olarak düşünüyorum; Kodu en sevdiğiniz makro kütüphaneye koyun ve bir daha asla düşünmemelisiniz.

2

SAS yardım ve belgelerinden biraz değiştirildi. Sayısal ve karakter karışmış olsa bile, durum ve sipariş verisini koruyoruz.

+0

Veri kümesini kapatmayı unutmayın: '% sysfunc (close (& dsid));' – zuluk

+0

@zuluk bu satırı nereye koyar? Bunun –

+0

makro sonunda bu satırları yazın iş yapamazsınız: (kapat (& DSID)) '% let rc =% sysfunc;' '% koymak varlist = & varlist;' '% tamir isimleri;' Ayrıca 'sasuser.class' yok. Benim için 'sashelp.class' çalışır. – zuluk