чтение иерархических данных в SAS

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

Данные выглядят примерно так:

Monkey & Horse Dance HORSE1 DDD4226 0001
3232233321221121.........
3222233333321332.........
Monkey & Horse Dance HORSE2 DDD5210 0001
1222121212221222.........
Monkey & Horse Dance HORSE3 DDD5405 0001
1111123211111211.........
1111111111111111.........

желаемый результат будет примерно таким:

Monkey & Horse Dance HORSE1 DDD4226 0001 3 2 3 2 2 3 3 3 2 1 2 2 1 1 2 1
Monkey & Horse Dance HORSE1 DDD4226 0001 3 2 2 2 2 3 3 3 3 3 3 2 1 3 3 2
Monkey & Horse Dance HORSE2 DDD5210 0001 1 2 2 2 1 2 1 2 1 2 2 2 1 2 2 2
Monkey & Horse Dance HORSE3 DDD5405 0001 1 1 1 1 1 2 3 2 1 1 1 1 1 2 1 1

Я пробовал что-то вроде этого:

data monkey;
    infile monkey;
    informat var7-var22 1;
    retain var1 var2 var3 var4 var6 var7;
    input define 1 @;
    if define='M' then input @1 var1 $14. var2 $char5. var3 $char5. var4 7. +0 var6;
    if define=('1' or '2' or '3' or '4' or '5') then input var7-var22;
run;

Может ли кто-нибудь указать мне в правильном направлении?


person statsNoob    schedule 27.11.2013    source источник


Ответы (1)


Используя это в качестве тестовых данных:

Monkey & Horse Dance HORSE1 DDD4226 0001
123456789012345
123456789012345
Monkey & Horse Dance HORSE2 DDD5210 0001
123456789012345
Monkey & Horse Dance HORSE3 DDD5405 0001
123456789012345
123456789012345

Этот код должен делать то, что (я думаю) вы хотите:

data monkey;
    infile "C:\monkey.txt" lrecl=40 truncover;

    length    var1 $14
            var2 $5
            var3 $6
            var4 $7
            var5 $4
            var6-var20 3;

    retain var1-var5;

    input @1 testchar $1. @;

    if testchar="M" then do;
        input    @1 var1 $14.
                @16 var2 $5.
                @22 var3 $6.
                @29 var4 $7.
                @38 var5 $4.;
    end;
    else do;
        input @1 var6 1. var7 1. var8 1. var9 1. var10 1. var11 1. var12 1. var13 1. var14 1. var15 1. var16 1. var17 1. var18 1. var19 1. var20 1.;
        output;
    end;
run;

Однако я бы также порекомендовал вам несколько вещей: 1) Я бы рекомендовал называть ваши переменные вещами, имеющими какое-то значение... а не просто "var1" или "var2". 2) Можете ли вы быть уверены, что первым символом в строке всегда будет «М»? В противном случае этот код не будет работать. 3) Подобрали ли вы хорошее руководство по изучению программирования для SAS? Многие из этих концепций чтения данных должны быть рассмотрены в первых главах или двух.

Удачи!

person John Chrysostom    schedule 27.11.2013