SAS / SQL Вопрос: Как объединить на основе переменной в строке с информацией в заголовке столбца? - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь объединить два набора данных. Один набор данных:

Date     Item    Price    Group
1/1/18    Hat      $5        1
2/1/18    Hat      $5        1
1/1/18    Shirt    $10       2
2/1/18    Shirt    $10       2
1/1/18    Shoes    $30       3
2/1/18    Shoes    $30       3

Другой набор данных:

Date        Group1AvgCost    Group2AvgCost      Group3AvgCost
1/1/18           $2                $8                $25
2/1/18           $3                $8                $23

А даты расширяются еще больше.

Я хочу ввести сумму в столбце GroupAvgCost для каждой группы. Есть ли способ сделать это в SAS или SQL?

Я бы хотел, чтобы что-то выглядело так:

Date     Item     Price     Group    AvgCost  
1/1/18   Hat      $5          1         $2
2/1/18   Hat      $5          1         $3
1/1/18   Shirt    $10         2         $8
2/1/18   Shirt    $10         2         $8
1/1/18   Shoes    $30         3         $25
2/1/18   Shoes    $30         3         $23

Я знаю, что один из способов сделать это - разделить второй набор данных (AvgCost) на отдельные файлы в зависимости от их группы, добавить номер группы, объединить все это друг с другом, а затем использовать этот файл, где все значения GroupAvgCosts в одном столбце, чтобы объединить в один набор данных.

Однако, учитывая количество дат и элементов, файл получится довольно длинным. Существует ли код для объединения набора данных 1 и набора данных два на основе даты и номера группы?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Просто используйте proc sql и join:

proc sql;
    select d1.*,
           (case when d1.group = 1 then d2.group1avgcost
                 when d1.group = 2 then d2.group2avgcost
                 when d1.group = 3 then d2.group3avgcost
            end) as groupavgcost
    from dataset1 d1 join
         dataset2 d2
         on d1.date = d2.date
0 голосов
/ 24 июня 2019

Вам понадобится шаг Proc TRANSPOSE и данные, чтобы иметь нужную форму и извлечь номер группы, необходимый для объединения.Вам также может понадобиться один или два вида, чтобы убедиться, что переменные by расположены в порядке.

Другой метод использует объект hash для хранения средних значений и поиска необходимого.

Например:

data have; 
attrib 
  date format=mmddyy8. informat=mmddyy8.
  item length=$20
  price format=dollar5. informat=dollar5.
  group length=8
;
input
Date     Item    Price    Group; datalines;
1/1/18    Hat      $5        1
2/1/18    Hat      $5        1
1/1/18    Shirt    $10       2
2/1/18    Shirt    $10       2
1/1/18    Shoes    $30       3
2/1/18    Shoes    $30       3
3/1/18    Scarf    $120      5
run;

data haverages;
attrib
  date format=mmddyy8. informat=mmddyy8.
  Group1AvgCost    Group2AvgCost      Group3AvgCost format=dollar5. informat=dollar5.
;
input
Date        Group1AvgCost    Group2AvgCost      Group3AvgCost; datalines;
1/1/18           $2                $8                $25
2/1/18           $3                $8                $23
run;

data want (keep=date item price group avgCost);
  set have;

  if _n_ = 1 then do;
    declare hash lookup();
    lookup.defineKey('date','group');
    lookup.defineData('avgcost');
    lookup.defineDone();
    call missing(avgcost);
    array avg Group1AvgCost    Group2AvgCost      Group3AvgCost;
    do while (not endOfAverages);
      set haverages end=endOfAverages;
      do _n_ = 1 to dim(avg);
        lookup.add(key:date, key:_n_, data:avg[_n_]);
      end;
    end;
  end;

  rc = lookup.find() ;
run;
...