循环中的SAS和行指针

循环中的SAS和行指针,sas,Sas,我只想读数字在第一行的观察结果。预期结果: data test; infile datalines; input k1 k2 k3 k4 k5 k6 k7 k8 k9 k10; array a(*) k1-k10; do i=1 to 10; if a(i) eq . then stop; line=a(i); input #line k1 k2 k3 k4 k5 k6 k7 k8 k9 k10; o

我只想读数字在第一行的观察结果。预期结果:

data test;
    infile datalines;
    input k1 k2 k3 k4 k5 k6 k7 k8 k9 k10;
    array a(*) k1-k10;
    do i=1 to 10;
        if a(i) eq . then stop;
        line=a(i);
        input #line k1 k2 k3 k4 k5 k6 k7 k8 k9 k10;
        output;
    end;
    stop;
    datalines;
        5 9 2 4 6 3 . . . .
        29 57 32 9 2 29 2 0 23 1
        83 34 28 1 43 3 24 2 6 2
        0 84 62 75 3 52 65 1 5 2
        0 2 12 45 92 3 60 24 6 2
        47 24 87 2 52 36 1 17 3 1
        90 93 2 1 40 20 75 2 5 14
        78 27 27 2 4 1 12 21 4 2
        21 40 3 21 3 19 3 2 4 2
        84 2 5 3 13 6 23 98 1 2 
    ;
run;
运行代码后出现的错误:

0  2  12 45 92 3  60 24 6  2
21 40 3  21 3  19 3  2  4  2
29 57 32 9  2  29 2  0  23 1
0  84 62 75 3  52 65 1  5  2
47 24 87 2  52 36 1  17 3  1
83 34 28 1  43 3  24 2  6  2

“x的适当值”是什么意思?我应该在代码中更改什么?

SAS告诉您需要修改您的infle语句,以允许它在前面读取足够的行数。对于编写的代码,
n=10
应该可以,因为用于获取行号的变量的值都不大于10

ERROR: Old line 3387 wanted but SAS is at line 3391.
       Use: INFILE N=X; , with a suitable value of x.
RULE:       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0
3391                47 24 87 2 52 36 1 17 3 1
k1=0 k2=2 k3=12 k4=45 k5=92 k6=3 k7=60 k8=24 k9=6 k10=2 i=2 line=2 _ERROR_=1 _N_=1

SAS告诉您需要修改您的infle语句,以允许它在前面阅读足够多的行。对于编写的代码,
n=10
应该可以,因为用于获取行号的变量的值都不大于10

ERROR: Old line 3387 wanted but SAS is at line 3391.
       Use: INFILE N=X; , with a suitable value of x.
RULE:       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0
3391                47 24 87 2 52 36 1 17 3 1
k1=0 k2=2 k3=12 k4=45 k5=92 k6=3 k7=60 k8=24 k9=6 k10=2 i=2 line=2 _ERROR_=1 _N_=1

您正在使用第二条
输入
语句覆盖数组中的值。在这里,它们被读入不同的变量,以便不被覆盖

data test;
    /*Add the n= option to the infile statement as suggested by log message*/
    infile datalines n= 10;
    input k1 k2 k3 k4 k5 k6 k7 k8 k9 k10;
    array a(*) k1-k10;
    array b(*) b1-b10;
    /*Make a copy of the first row 
      that won't get overwritten by subsequent input statements*/
    do i=1 to 10; 
        b(i) = a(i);
    end;
    do i=1 to 10;
      if b(i) eq . then stop;
      line=b(i);
      input #line k1 k2 k3 k4 k5 k6 k7 k8 k9 k10;
      output;
    end;
    stop;
    datalines;
5 9 2 4 6 3 . . . .
29 57 32 9 2 29 2 0 23 1
83 34 28 1 43 3 24 2 6 2
0 84 62 75 3 52 65 1 5 2
0 2 12 45 92 3 60 24 6 2
47 24 87 2 52 36 1 17 3 1
90 93 2 1 40 20 75 2 5 14
78 27 27 2 4 1 12 21 4 2
21 40 3 21 3 19 3 2 4 2
84 2 5 3 13 6 23 98 1 2 
    ;
run;

您正在使用第二条
输入
语句覆盖数组中的值。在这里,它们被读入不同的变量,以便不被覆盖

data test;
    /*Add the n= option to the infile statement as suggested by log message*/
    infile datalines n= 10;
    input k1 k2 k3 k4 k5 k6 k7 k8 k9 k10;
    array a(*) k1-k10;
    array b(*) b1-b10;
    /*Make a copy of the first row 
      that won't get overwritten by subsequent input statements*/
    do i=1 to 10; 
        b(i) = a(i);
    end;
    do i=1 to 10;
      if b(i) eq . then stop;
      line=b(i);
      input #line k1 k2 k3 k4 k5 k6 k7 k8 k9 k10;
      output;
    end;
    stop;
    datalines;
5 9 2 4 6 3 . . . .
29 57 32 9 2 29 2 0 23 1
83 34 28 1 43 3 24 2 6 2
0 84 62 75 3 52 65 1 5 2
0 2 12 45 92 3 60 24 6 2
47 24 87 2 52 36 1 17 3 1
90 93 2 1 40 20 75 2 5 14
78 27 27 2 4 1 12 21 4 2
21 40 3 21 3 19 3 2 4 2
84 2 5 3 13 6 23 98 1 2 
    ;
run;

您是否打算将其用作矩阵?如果是这样的话,可以通过
proc iml
直接导入,但需要其他人提供建议。不,我只需要它像描述的那样简单。
infle n=x
错误掩盖了另一个问题-当您访问do循环中的每个输入语句时,您正在覆盖试图用作行号的变量k1-k10。请参阅更新的答案。是否打算将其用作矩阵?如果是这样的话,可以通过
proc iml
直接导入,但需要其他人提供建议。不,我只需要它像描述的那样简单。
infle n=x
错误掩盖了另一个问题-当您访问do循环中的每个输入语句时,您正在覆盖试图用作行号的变量k1-k10。请参阅更新的答案。“这不会给您所需的输出”。将此作为“答案”发布没有任何意义:)不过,它让你越过了眼前的障碍。我想我看到了你现在想要做的事情——再看一眼。“这并没有给你想要的输出”。将此作为“答案”发布没有任何意义:)不过,这会让你克服眼前的障碍。我想我明白你现在想做什么了——再看一眼。