2016-04-12 13 views
1

SUM dışında, SAS gerçekten satır işlevlerinden yoksundur. Uzatılmış eksik kodları uzunlamasına veri kümesinin dalgaları içinde saymak istedim.SAS: vartayı sas makrosuna geçirme

Her dalga için sabit kodlanmış bir varlist üzerinde işlem yapmak için dizileri kullanabilirim, ancak her dalga için arayabileceğim bir makro yapma şansım olmadı. Sorun, özellikle ilk - son gösterim kullanılıyorsa, varyantın içinden geçmek için bir yol gibi görünmüyordu.

data xxx; 
    input a b c d e f; 
    datalines; 
1 2 3 4 5 6 
.w .w .w .w .w .w 
3 4 5 .w .w .w 
    ; 
run; 

data yyy(drop=i); set xxx;  
    array wave1vars(*) a--c; 
    wave1count = 0; 
    do i = 1 to dim(wave1vars); 
    if wave1vars(i) = .w then wave1count = wave1count +1; 
    end; 

    array wave2vars(*) d--f; 
    wave2count = 0; 
    do i = 1 to dim(wave2vars); 
    if wave2vars(i) = .w then wave2count = wave2count +1; 
    end; 
run; 
+1

Neden bir makro listesini% mymac (varlist = a - c) parametresinin değeri iyi olarak kullanacağını anlamıyorum. – Tom

cevap

1
Ayrıca gibi, o dizede bulunan W en sayısını sayarak, bir birleştirilmiş karakter dizesine değerlerini dönüştürmek için CATT() işlevini kullanarak, tamamen diziler önleyebilirsiniz

:

343 data want; 
344 input a b c d e f; 
345 wave1count=countc(catt(of a--c),'W'); 
346 wave2count=countc(catt(of d--f),'W'); 
347 put _all_; 
348 datalines; 

a=1 b=2 c=3 d=4 e=5 f=6 wave1count=0 wave2count=0 _ERROR_=0 _N_=1 
a=W b=W c=W d=W e=W f=W wave1count=3 wave2count=3 _ERROR_=0 _N_=2 
a=3 b=4 c=5 d=W e=W f=W wave1count=0 wave2count=3 _ERROR_=0 _N_=3 
NOTE: The data set WORK.WANT has 3 observations and 8 variables. 

352 ; 
353 run; 
+0

Bu çok iyi çalışıyor. Teşekkürler. –

0

deneyin

wave1count = nmiss(of a--c); 
wave2count = nmiss(of d--f); 
+0

Muhtemelen, bunun sadece “.w” değil, * tüm * eksik değerleri dikkate alacağına işaret etmeye değer. Bu durumda dizilerin zaten en iyi seçenek olduğundan şüpheleniyorum. – user667489

+0

evet, eksik() ve Nmiss(), SAS'daki 28 eksik kod için duyarsızdır. Bu durumda . madde olmayan yanıt için, s atlama-n-dolgu nedeniyle yapısal kayıp içindir ve .w dalgası eksiktir. Bu farklılıklar, itiraz sırasında ele alınabilir, ancak dalga kayıpları için bayraklar oluşturmam gerekiyor çünkü bazı sonraki analizler, verileri uzunlamasına yığabilir ve dalga eksiklerini (örneğin, tehlike modelleri) kaldırabilir. –

+0

Eğer dalga için bir bayrak eksikse o zaman Gerçekten yanıt veren bir alan değil. Bu anketle ilgili gerçekten meta veriler. – Tom

1

Neden bir makro gerekiyor? Neden sadece çok boyutlu bir dizi kullanmıyoruz. Her dalgada soru sayısı farklı değilse?

missing w; 
data have; 
    input a b c d e f; 
cards; 
1 2 3 4 5 6 
w w w w w w 
3 4 5 w w w 
;;;; 

data want ; 
    set have ; 
    array wavevars (2,3) a--c d--f ; 
    array wavecount (2) ; 
    do i=1 to dim(wavecount); 
    wavecount(i)=0; 
    do j=1 to dim2(wavevars); 
     wavecount(i)+.w = wavevars(i,j); 
    end; 
    end; 
    drop i j ; 
run; 
+0

İyi cevap. Ben, iki boyutlu bir diziyi kullanmak için cazip olduğumda, çoğu zaman verileri aktarmakta daha iyi olduğumu farkettim. Yani, dalga 1 ve dalga 2 için aynı 3 çeşidi varsa, altı değişkenli üç sıradan dört varsayıma (dalga, a, b, c) sahip altı sıraya geçin. Sadece bir düşünce. – Quentin

+0

2-D dizisini seviyorum, ancak değişkenlerin sayısı dalgadan dalgaya biraz farklı olabilir ve ben farkın daha büyük olduğu uzunlamasına çalışmaları hayal edebiliyorum. –