2015-07-17 3 views
1

У меня есть набор данныхмассивы SAS с несколькими столбцами

Data have; 
input A B C; 
cards; 
1 . . 
. . 1 
1 1 . 
run; 

И я ищу выход, который, как это.

A B C OUT 
1 . . A 
. . 1 C 
1 1 . A,B 

Я написал программу так:

Data want; 
set have; 
array U(3)A B C; 
do i=1 to 3; 
if U(i)^=. then OUT=cat(vname(u(i),','); 
end; 
run; 

Это дает только последний VNAME и не конкатенацию.

+1

Не забудьте включить в вашем 'CAT' заявление : '... then OUT = CAT (OUT, vname (u (i), ',');' – sasfrog

+0

@sasfrog Привет, теперь он дает пробелы, когда я слежу за тем, как вы написали. – user3658367

+0

Извините yep: catx - согласно Ответ Кита – sasfrog

ответ

3

При использовании сепаратора с конкатенации, то catx является функция для использования, или даже лучше call catx, который сводит на нет необходимости положить out = и используя out в конкатенации, а также. Обе эти функции будут обрезать любые ведущие или завершающие пробелы.

Другая проблема с вашим кодом состоит в том, что, поскольку out получен из числовых переменных, SAS будет по умолчанию использовать тип и числовым. Вам нужно определить тип для персонажа заранее (я сделал это с length заявлением.

Следующий код достигает своей цели.

Data have; 
input A B C; 
cards; 
1 . . 
. . 1 
1 1 . 
run; 

data want; 
set have; 
length out $20; 
array U{3} A B C; 
do i = 1 to 3; 
if not missing(U{i}) then call catx(',',out,vname(U{i})); 
end; 
drop i; 
run; 
Смежные вопросы