0
data tempx1;
  input ID;
  cards;
  1
  2
  3
  4
  ;
run;

data tempx2;
   set tempx1;
   array diag{4} d1 d2 d3 d4 (1,2,3,4);
     do i = 1 to 4;
      if diag[i] = ID then diag[i] = 1; else diag[i] = 0;
     end;
    drop i;
run;

1を配列の対角線に配置したいのですが、ここで何を間違えましたか?

4

2 に答える 2

0

初期化された値を実際に使用しようとはしていないので、より簡単な解決策があると思います。適切な比較を行っていないだけです。iと比較し、diag[i]と比較しないでください。

data tempx2;
   set tempx1;
   array diag{4} d1 d2 d3 d4 (1,2,3,4);
     do i = 1 to 4;
      if i = ID then diag[i] = 1; else diag[i] = 0;
     end;
    drop i;
run;
于 2013-02-04T00:45:23.097 に答える
0

値のセットを使用して配列を初期化する場合、指定する値は1回だけ設定されます。データセットの暗黙的なループごとに再設定されることはありません。

したがって、これを明示的に行う必要があります。次のコードが機能します。

data tempx2;
set tempx1;
array diag{4} d1 d2 d3 d4 (1,2,3,4);

do i = 1 to 4;
diag[i] = i;
end;

do i = 1 to 4;
if diag[i] = ID then diag[i] = 1; else diag[i] = 0;
end;

drop i;

run;

これが、なぜこれが機能するのかを理解しやすくするためのデモです。

data test;
set tempx1;
array diag{4} d1 d2 d3 d4 (1,2,3,4);
put _all_;
output;
if _n_ = 1 then diag{1} = 10;
if _n_ = 3 then diag{1} =  20;
put _all_;
output;
run;
于 2013-02-03T11:54:56.390 に答える