2016-06-19 2 views
0

Я хочу получить значения уровня строки (кредиты, связанные с номером учетной записи) из таблицы SAS - Ниже приведен пример.SAS получение значений из строки

enter image description here

Входной

Account Number Loans 
123    abc, def, ghi 
456    jkl, mnopqr, stuv 
789    w, xyz 

Выход

Account Numbers Loans 
123    abc 
123    def 
123    ghi 
456    jkl 
456    mnopqr 
456    stuv 
789    w 
789    xyz 

кредиты разделяются запятыми, и они не имеют длину починки.

+0

Возможный дубликат [SAS Транспонирование Comma Расстались поле] (http://stackoverflow.com/questions/28358093/sas-transpose-comma-separated-field) – Reeza

ответ

1

Используйте countw(), чтобы подсчитать количество значений по строке и scan(), чтобы выбрать их.

Оба имеют последнюю необязательную переменную, чтобы указать разделитель, который в вашем случае равен ,.

data Loans (keep= AccountNo Loan); 
    infile datalines truncover; 
    Input @1 AccountNo 3. @17 LoanList $250.; 
    if length(LoanList) gt 240 then put 'WARNING: You might need to extend Loans'; 

    label AccountNo = 'Account Number' Loan = 'Loans'; 
    do loanNo = 1 to countw(LoanList, ','); 
     Loan = scan(LoanList, loanNo, ','); 
     output; 
    end; 
    datalines; 
123    abc, def, ghi 
456    jkl, mnopqr, stuv 
789    w, xyz 
; 

proc print data=Loans label noobs; 
run; 

Для обратной работы требуются различные методы.

Чтобы разрешить обработку by AccountNo, мы должны сначала построить набор данных SAS с входа, а затем прочитать это с помощью инструкции set.

data Loans; 
    infile datalines; 
    input @1 AccountNo 3. @5 Loan $25.; 
    datalines; 
123 15-abc 
123 15-def 
123 15-ghi 
456 99-jkl 
456 99-mnopqr 
456 99-stuv 
789 77-w 
789 77-xyz 
; 
data LoanLists; 
    set Loans; 
    by AccountNo; 

Теперь создать Loanlist достаточно долго, и перезаписывать поведение по умолчанию SAS повторно инициализировать все переменные для каждого наблюдения (= строка данных).

format Loanlist $250.; 
    retain Loanlist; 

Соберите все ссуды на счет, разделив их запятой на пробел.

if first.AccountNo then Loanlist = Loan; 
    else Loanlist = catx(', ',Loanlist,Loan); 
    if length(LoanList) gt 240 then put 'WARNING: you might need to extend LoanList'; 

Храните только полный список учетных записей.

if last.AccountNo; 
    drop Loan; 
proc print; 
run; 
+0

Спасибо так много, и COUNT нед функция сканирования сделал работа – user3681328

+0

Пожалуйста, дайте мне знать, что, если я хочу изменить процесс? – user3681328

+0

Принимая или повышая голос, мой ответ помог бы. –

Смежные вопросы