Группировка SAS по счетчикам на переменную - создание первичного ключа - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть некоторые данные, которые нужно разбить на 12 или около того разных групп, ключ отсутствует, и порядок, в котором эти данные важны.

Данные имеют несколько групп, и эти группы имеютособые и / или вложенные группы в этом.Каждая группа будет разделена, поскольку данные представлены в иерархическом формате.поэтому каждая «ГРУППА» имеет свой собственный формат, который необходимо объединить в одну строку (или несколько) строк.

Пример файла данных:

"TRANS","23115168","","","OTVST","","23115168","","COMLT","","",20180216,"OAMI","501928",,
"MTPNT","UPDTE",2415799999,"","","17","","",,20180216,
"ASSET","","REPRT","METER","","CR","E6VG470","LPG",2017,"E6S05633099999","","","LI"
"METER","","U","S1",6.0000,"","",20171108,"S",,
"REGST","","METER",5,"SCMH",1.000
"READG",20180216,,"00990"
"ASSET","","REMVE","METER","","CR","E6VG470","LPG",2017,"E6S05633099999","","","LI"
"METER","","U","S1",6.0000,"","",20171108,"S",,
"REGST","","METER",5,"SCMH",1.000
"READG",20180216,,"00990"
"ASSET","","INSTL","METER","","CR","E6VG470","LPG",2017,"E6S06769699999","","","LI"
"METER","","U","S1",6.0000,"","",20180216,"S",,
"REGST","","METER",5,"SCMH",1.000
"READG",20180216,,"00000"
"APPNT","",20180216,,"","123900",""

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

1. Transaction [TRANS]
   1.1. Meter Point [MTPNT]
      1.1.1. Asset [ASSET]
         1.1.1.1. Meter [METER]
         1.1.1.2. Converter [CONVE]
         1.1.1.3. Register Details [REGST]
            1.1.1.3.1. Reading [READG]
         1.1.1.4. Market Participant [MKPRT]
         1.1.1.5. Name [NAME]
            1.1.1.5.1. Address [ADDRS]
            1.1.1.5.2. Contact Mechanism [CONTM]
   1.2. Appointment [APPNT]
   1.3. Name [NAME]
      1.3.1. Address [ADDRS]
      1.3.2. Contact Mechanism [CONTM]
   1.4. Market Participant [MKPRT]

Отраслевые данные GAS, поэтому в этом потоке вы можете иметь много ASSET на MTPNT, а эти многие ASSET могут иметь много REGST, потому что именно здесь показания счетчикасохраняется для READG

Я пытался использовать по группам и сначала итеративно.обработки, но я не работал с этим типом данных раньше.Мне нужен способ разделения для создания ключа для каждой группы, который после разделения и определения полей можно объединить вместе.

Я пытался манипулировать infile , чтобы вседанные отображаются в одной строке для каждого транс, но у меня все еще есть проблема применения полей, и порядок имеет первостепенное значение.

Мне удалось получить несколько ключей для некоторых групп, но после разделения они недовольно объединиться.

data TRANS;
    set mpancreate_a;
    by DataItmGrp NOTSORTED;

    if first.DataItmGrp then 
        do;
            if DataItmGrp = "TRANS" then 
                TRANSKey+1;
        end;
run;

data TRANS;
    set TRANS;
    TRANSKey2 + 1;
    by DataItmGrp NOTSORTED;

    if first.DataItmGrp then
        do;
            if DataItmGrp = "TRANS" then
                TRANSKEY2=1;
        end;


run;

data MTPNT;
    set TRANS;
    by DataItmGrp NOTSORTED;

    if first.DataItmGrp then
        do;
            if DataItmGrp = "MTPNT" then
                MTPNTKEY+1;
        end;
run;

data MTPNT;
    set MTPNT;
    by  MTPNTKEY NOTSORTED;

    if first.MTPNTKEY  and DataItmGrp = "MTPNT" then
        MTPNTKEY2=0;
    MTPNTKEY2+1;
run;

data ASSET;
    set MTPNT;

    IF MTPNTKEY = 0 THEN
        MTPNTKEY2=0;
    by DataItmGrp NOTSORTED;

    if first.DataItmGrp then
        do;
            if DataItmGrp = "ASSET" then
                ASSETKEY+1;
        end;
run;

data ASSET;
    set ASSET;
    by  ASSETKEY NOTSORTED;

    if first.ASSETKEY  and DataItmGrp = "ASSET" then
        ASSETKEY2=0;
    ASSETKEY2+1;

    IF ASSETKEY =0 THEN
        ASSETKEY2=0;
run;

Мне нужен счетчик для каждой найденной группы и сохраненный счетчик для этой конкретной группы - но я не могу понять, как входить и выходить из групп на основе иерархиивыше

Я надеюсь, что, получив эти ключи, я могу разделить данные по группам, а затем объединить их влево


        _n_     TRANS   TRANS2  MTPNT   MTPNT2
TRANS   1       1       0       0       0
MTPNT   2       2       1       1       1
ASSET   3       3       1       2       1
METER   4       4       1       3       1
READG   5       5       1       4       1
MTPNT   6       6       1       1       2
ASSET   7       7       1       2       2
METER   8       8       1       3       2
READG   9       9       1       4       2
APPNT   10      10      1       5       2
TRANS   11      1       2       6       2
MTPNT   12      2       2       1       3
ASSET   13      3       2       2       3
METER   14      4       2       3       3
READG   15      5       2       4       3
MTPNT   16      6       2       1       4
ASSET   17      7       2       2       4
METER   18      8       2       3       4
READG   19      9       2       4       4
APPNT   20      10      2       5       4   




1 Ответ

0 голосов
/ 24 сентября 2019

Ввод иерархических данных из файла данных, который не имеет определенных маркеров, является проблематичным.Лучшее предложение, которое у меня есть, это понять, какие основные ценности вы хотите извлечь и в каком контексте вы хотите их узнать.Для этой проблемы самым простым первым подходом было бы иметь одну монолитную таблицу с категориальными переменными для захвата пути, который опускается до значимого значения (показания счетчика).

Более сложная ситуация будет первым маркером в каждомстрока управляет вводом для этой строки и выходной таблицы, к которой она принадлежит.Поскольку нет никаких ориентиров относительно абсолютной или относительной позиции иерархии (как в NAME и MKPRT), нет 100% уверенного способа разместить их в иерархии, что также может повлиять на размещение элементов, считываемых из последующих строк данных.

В зависимости от истинной сложности и соблюдения правил в реальном мире, вы можете или не можете «пропустить» чтение некоторых значений.

Предположим, что есть более простая цель - просто получитьпоказания счетчика.

data want;

length tier level1-level6 $8 path $64 meterReadingString $8 dummy $1;
retain level1-level5 path;
attrib readingdate informat=yymmdd10. format=yymmdd10.;

infile cards dsd missover;

input @1 tier @; * held input - dont advance read line yet;

if tier="TRANS" then do;
  level1 = tier;
  call missing (of level2-level6);
  path = catx("/", of level:);
end;

if tier="MTPNT" and path="TRANS" then do;
  level2 = tier;
  call missing (of level3-level6);
  path = catx("/", of level:);
end;

if tier="ASSET" and path="TRANS/MTPNT" then do;
  level3 = tier;
  call missing (of level4-level6);
  path = catx("/", of level:);
end;

if tier="METER" and path="TRANS/MTPNT/ASSET" then do;
  level4 = tier;
  call missing (of level5-level6);
  path = catx("/", of level:);
end;

if tier="REGST" and path="TRANS/MTPNT/ASSET/METER" then do;
  level5 = tier;
  call missing (of level6-level6);
  path = catx("/", of level:);
end;

if tier="READG" and path="TRANS/MTPNT/ASSET/METER/REGST" then do;
  level6 = tier;
  path = catx("/", of level:);
  input @1 tier readingdate dummy meterReadingString @; * reread line according to tier;

  meterReading = input(meterReadingString, best12.);

  if path = "TRANS/MTPNT/ASSET/METER/REGST/READG" then OUTPUT;
end;    

datalines;
"TRANS","23115168","","","OTVST","","23115168","","COMLT","","",20180216,"OAMI","501928",,
"MTPNT","UPDTE",2415799999,"","","17","","",,20180216,
"ASSET","","REPRT","METER","","CR","E6VG470","LPG",2017,"E6S05633099999","","","LI"
"METER","","U","S1",6.0000,"","",20171108,"S",,
"REGST","","METER",5,"SCMH",1.000
"READG",20180216,,"00990"
"ASSET","","REMVE","METER","","CR","E6VG470","LPG",2017,"E6S05633099999","","","LI"
"METER","","U","S1",6.0000,"","",20171108,"S",,
"REGST","","METER",5,"SCMH",1.000
"READG",20180216,,"00990"
"ASSET","","INSTL","METER","","CR","E6VG470","LPG",2017,"E6S06769699999","","","LI"
"METER","","U","S1",6.0000,"","",20180216,"S",,
"REGST","","METER",5,"SCMH",1.000
"READG",20180216,,"00000"
"APPNT","",20180216,,"","123900",""
run;

Вы можете использовать это в качестве основы для более сложного считывателя, который имеет различный набор данных output <tier> для каждого обнаруженного уровня или пути к уровню.Вам потребуется другой оператор input для уровня, аналогичный тому, как читается READG.

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