Как я могу установить данные с конкретной системой - PullRequest
0 голосов
/ 23 мая 2019

У меня маленькая проблема. В качестве примера таблиц HAVE1 и HAVE2 я хочу создать таблицу типа WANT, установить под определенными данными строки из HAVE2 - для всех столбцов (начиная с COL1 до COL19, без COL20) - и получить таблицу, подобную WANT. Как я могу это сделать?

data HAVE1;
infile DATALINES dsd missover;
input ID NAME $ COL1-COL20;
CARDS;
1, A1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ,20
2, A2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
3, B1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 20, 21 , 21, 22 
4, B2, 1, 20, 3, 20, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 23, 22, 23
5, C1, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 12, 13, 14, 15, 16, 17, 17, 17, 17
6, C2, 1, 2, 3, 20, 5, 6, 7, 8, 02, 10, 11, 12, 30, 14, 15, 16, 17, 18, 19, 20
;run;

Data HAVE2;
infile DATALINES dsd missover;
input ID NAME $ WARTOSC;
CARDS;
1, SUM, 50000
2, SUM, 55000
3, SUM, 60000
;run;

DATA WANT;
infile DATALINES dsd missover;
input ID NAME $ COL1-COL20;
CARDS;
1, A1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ,20
1, SUM_1    ,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000,50000
2, A2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
2, SUM_2, 55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000,55000
3, B1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 20, 21 , 21, 22 
3, SUM_3,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000
4, B2, 1, 20, 3, 20, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 23, 22, 23
5, C1, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 12, 13, 14, 15, 16, 17, 17, 17, 17
6, C2, 1, 2, 3, 20, 5, 6, 7, 8, 02, 10, 11, 12, 30, 14, 15, 16, 17, 18, 19, 20
;run;

Ответы [ 2 ]

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

Похоже, вам просто нужно переформатировать второй набор данных, чтобы он соответствовал тому, что вы хотите, и они объединяют их.Просто скопируйте значение WARTOSC во все столбцы и удалите исходную переменную WARTOSC.

data HAVE1;
  infile CARDS dsd truncover;
  input ID NAME $ COL1-COL5;
CARDS;
1, A1, 1, 2, 3, 4, 5
2, A2, 1, 2, 3, 4, 5
3, B1, 3, 4, 5, 6, 7
4, B2, 1, 20, 3, 20, 5
5, C1, 20, 2, 3, 4, 5
6, C2, 1, 2, 3, 20, 5
;

data HAVE2;
  infile CARDS dsd truncover;
  input ID NAME $ WARTOSC;
CARDS;
1, SUM, 50000
2, SUM, 55000
3, SUM, 60000
;

data have2_fixed;
  set have2;
  name=catx('_',name,id);
  array col col1-col5;
  do over col ; col=wartosc; end;
  drop wartosc;
run;

data want ;
  set have1 have2_fixed;
  by id;
run;

Вы можете внести изменения во время объединения, если наборы данных велики.

data want ;
  set have1 have2 (in=in2);
  by id;
  array col col1-col5;
  if in2 then do;
    name=catx('_',name,id);
    do over col ; col=wartosc; end;
  end;
  drop wartosc;
run;

Результаты:

Obs    ID    NAME      COL1     COL2     COL3     COL4     COL5

 1      1    A1           1        2        3        4        5
 2      1    SUM_1    50000    50000    50000    50000    50000
 3      2    A2           1        2        3        4        5
 4      2    SUM_2    55000    55000    55000    55000    55000
 5      3    B1           3        4        5        6        7
 6      3    SUM_3    60000    60000    60000    60000    60000
 7      4    B2           1       20        3       20        5
 8      5    C1          20        2        3        4        5
 9      6    C2           1        2        3       20        5
1 голос
/ 23 мая 2019

Ваша таблица want весьма своеобразна, вам может быть лучше создать отчет вместо набора данных, который вы могли бы просто proc print.

Независимо от того, для шага для have2 потребуетсяпреобразование имени и репликация wartosc.

Например:

data want (drop=wartosc);
  set have1 end=end1;
  output;

  if not end2 then 
    set have2(rename=id=id2) end=end2;

  if id = id2 then do;
    array col col1-col20;
    do over col; col=wartosc; end;
    name = catx('_', name, id);
    output;
  end;

run;

Вам может потребоваться дополнительная логика, если может иметь место случай want2, имеющий больше строк, чем want1,

...