0

我正在尝试使用具有分层结构的 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;

谁能指出我正确的方向?

4

1 回答 1

0

使用它作为测试数据:

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) 你能确定一行的第一个字符总是“M”吗?如果没有,此代码将不起作用。3) 你有没有找到一本学习 SAS 编程的好指南?很多关于读入数据的概念应该在第一章或第二章中介绍。

祝你好运!

于 2013-11-27T18:29:09.653 回答