Обновление значения в одной строке в другую строку на основе того же значения столбца - PullRequest
0 голосов
/ 28 мая 2018

Мой набор данных XXX содержит записи, в которых 2 строки образуют пару на основе одинакового значения столбца FRUIT.Разница в том, что одна строка содержит пустое поле значения COUNTRY, а вторая строка содержит фактическое значение COUNTRY.Аналогично, первая строка содержит пустое поле COLOR, а вторая строка содержит фактическое значение COLOR.Теперь я хотел бы заполнить значение COLOR для строки (источника), в которой заполнено значение COUNTRY, до пустого поля COLOR в первой строке (назначения), где поле COUNTRY пустое.

XXX DATASET [current]
FRUIT | COUNTRY | COLOUR
Banana | . | .
Banana | Spain | Yellow
Apple | . | .
Apple | USA | Red
Pear | China | Green
Pear | . | . 

YYY [DESIRED]
FRUIT | COUNTRY | COLOUR
Banana | . | Yellow
Banana | Spain | Yellow
Apple | . | Red
Apple | USA | Red
Pear | China | Green
Pear | . | Green

Конечно, этот примертупой, но это действительный бизнес-кейс.

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

Можете ли вы посоветовать это?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Попробуйте это:

proc sort data=have;
by fruit country;
run;

data want( rename=(country1=country colour1=colour));
  set have end=eof;
     by fruit notsorted;
     if first.fruit then do;
       point = _N_ + 1;
       set have (keep= country colour rename= (country = country1 colour = colour1)) point=point;
    end;
   else do; 
       country1=country;
       colour1 = colour;
       end;
     drop country colour;
run;  
0 голосов
/ 28 мая 2018

То есть вы хотите применить не пропущенные значения COLOUR к каждой записи с таким же значением FRUIT?Звучит как простая проблема MERGE.

data YYY;
  merge XXX(drop=colour) XXX(keep=fruit colour where=(not missing(colour)));
  by fruit;
run;
0 голосов
/ 28 мая 2018

Вот один из способов сделать это, используя retain для переноса значений из предыдущих строк.Хитрость заключается в том, чтобы сохранить временный столбец, а не тот, который вы хотите заполнить:

data have;
input FRUIT $ COUNTRY $ COLOUR $;
infile cards dlm='|';
cards;
Banana | . | .
Banana | Spain | Yellow
Apple | . | .
Apple | USA | Red
Pear | China | Green
Pear | . | . 
;
run;

/*Sort missing values of COLOUR to the bottom within each FRUIT*/
proc sort data = have out = temp;
    by FRUIT descending COLOUR; 
run;

data want;
    set temp;
    by FRUIT;
    retain t_COLOUR 'placeholder';
    if first.FRUIT then do;
        t_COLOUR = .;
        if not(missing(COUNTRY)) then t_COLOUR = COLOUR;
    end;
    else COLOUR = coalescec(COLOUR, t_COLOUR);
    drop t_COLOUR;
run;
...