Многомерный массив - установить для табличных данных из массива - PullRequest
0 голосов
/ 22 мая 2019

У меня проблема с многомерным массивом.Я создал расчет между двумя типами данных из одной таблицы.Пример данных из таблицы BT_MATRYCA.И я делю данные из TYP: VAL_A, начиная с COL1 до COL17, по значению из SUMA_RAZEM из строки с TYP: VAL_B.

Команда "put d_st [i, j] =;"ставит хорошее значение, но мне нужно создать таблицу с этим расчетом (многомерный, с X и Y).Как я могу это сделать?

data BT_MATRYCA;
infile DATALINES dsd missover;
input NAME $ TYP $ COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9 COL10 COL11 COL12 COL13 COL14 COL15 COL16 COL17 SUMA_RAZEM;
CARDS;
A1, VAL_A, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 500
A1, VAL_B, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 600
B1, VAL_A, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 20, 550
B1, VAL_B, 1, 20, 3, 20, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 800
C1, VAL_A, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 12, 13, 14, 15, 16, 17, 900
C1, VAL_B, 1, 2, 3, 20, 5, 6, 7, 8, 02, 10, 11, 12, 30, 14, 15, 16, 17, 780
;run;


data t3;
array m[6,18] _temporary_;
array n[6,18] _temporary_;
array d_st[6,18] _temporary_;
call missing(of d_st[*]);

if _n_ = 1 then do;
   do i = 1 by 1 until(z1);
      set BT_MATRYCA (where=(TYP = 'VAL_A')) end = z1;
      array c[18] COL1--SUMA_RAZEM;
      do j = 1 to 18;
         m[i, j] = c[j];
      end;
   end;

   do i = 1 by 1 until(z2);
      set BT_MATRYCA (where=(TYP = 'VAL_B')) end = z2;
      array v[18] COL1--SUMA_RAZEM;
      do j = 1 to 18;
         n[i,j] = v[j];
      end;
  end;
end;

do i = 1 to 6;
   do j = 1 to 18;
        IF m[i,18] ne 0 then
            d_st[i,j] = coalesce((n[i,j] / m[i,18]),0);
        ELSE
            d_st[i,j] = 0;
   end;
end;

do i = 1 to 6;
   do j = 1 to 18;
      put d_st[i,j] =;
   end;
end;
stop;
run;

`

1 Ответ

1 голос
/ 22 мая 2019

Не совсем понятно, о чем вы спрашиваете, но звучит так, как будто вы хотите что-то вроде этого:

data t3 wide(keep = x1-x6) long(keep = x y z);
array m[6,18] _temporary_;
array n[6,18] _temporary_;
array d_st[6,18] _temporary_;
array _x[6] x1-x6;

put d_st[1,1]=;

if _n_ = 1 then do;
   do i = 1 by 1 until(z1);
      set BT_MATRYCA (where=(TYP = 'VAL_A')) end = z1;
      array c[18] COL1--SUMA_RAZEM;
      do j = 1 to 18;
         m[i, j] = c[j];
      end;
   end;

   do i = 1 by 1 until(z2);
      set BT_MATRYCA (where=(TYP = 'VAL_B')) end = z2;
      array v[18] COL1--SUMA_RAZEM;
      do j = 1 to 18;
         n[i,j] = v[j];
      end;
  end;
end;

do i = 1 to 6;
   do j = 1 to 18;
        IF m[i,18] ne 0 then
            d_st[i,j] = coalesce((n[i,j] / m[i,18]),0);
        ELSE
            d_st[i,j] = 0;
   end;
end;

/* Note switching of inner and outer loops*/
do j = 1 to 18;
  do i = 1 to 6;
    _x[i] = d_st[i,j];
    x = i;
    y = j;
    z = d_st[i,j];
    output long;
  end;
  output wide;
end;

stop;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...