2016-04-12 3 views
1

За исключением SUM, SAS действительно не хватает функций ряда. Я хотел посчитать некоторые пропущенные недостающие коды в волнах продольного набора данных.SAS: передача varlist в sas macro

Я могу использовать массивы для обработки жесткого кодированного varlist для каждой волны, но мне не повезло сделать макрос, который я мог бы назвать для каждой волны. Проблема, по-видимому, не в том, чтобы передавать в varlist, особенно если использовать первую нотацию.

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

Я не понимаю, почему вы не можете передать varlist, поскольку значение параметра макроса% mymac (varlist = a - c) будет работать нормально. – Tom

ответ

1

Вы также можете избежать массивов в целом, с помощью функции CATT() для преобразования значения в сцепленную строку символов, то подсчет количества W, отмечаемые в строке, например:

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

Это работает очень хорошо. Благодарю. –

0

Попробуйте

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

Возможно, стоит отметить, что это будет считаться * все * отсутствующие значения, а не только '.w'. Я подозреваю, что массивы уже являются лучшим вариантом в этом случае. – user667489

+0

Да, missing() и Nmiss() нечувствительны к 28 недостающим кодам в SAS. В этом случае . для элемента без ответа, .S для структурного отсутствия из-за skip-n-fill, а .w - для отсутствия волны. Эти различия могут быть обработаны во время вменения, но мне нужно создать флаги для отсутствия волны, потому что некоторые последующие анализы могут складывать его высокие данные и удалять отсутствующие волны (например, модели опасности) –

+0

Если это флаг для отсутствия волны, на самом деле не является полем уровня респондентов. Это действительно метаданные об опросе. – Tom

1

Зачем вам нужен макрос? Почему бы просто не использовать многомерный массив. Если количество вопросов в каждой волне не меняется?

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

Хороший ответ. Тем не менее, я, когда у меня возникает соблазн использовать двухмерный массив, я часто понимаю, что мне лучше переносить данные. Поэтому, если это одинаковые 3 вара для волны 1 и волны 2, переходите от трех строк с шестью переменными до шести строк с четырьмя варами (волна, a, b, c). Просто мысль. – Quentin

+0

Мне нравится 2-D массив, но число переменных может немного отличаться от волны к волне, и я мог бы представить продольные исследования, где разница была больше. –