根据相同的列值将一行中的值更新为另一行

时间:2018-05-28 10:44:46

标签: sas

我的数据集XXX包含记录,其中2行基于FRUIT列的相同值形成一对。不同之处在于,一行包含空的COUNTRY值字段,而第二行包含实际的COUNTRY值。类似地,第一行包含空的COLOR字段,而第二行包含实际的COLOR值。现在我想填充填充了COUNTRY值的row(source)的COLOR值到第一行的COUNTRY字段为空的空COLOR字段(destination)。

<a href=“test.html”>
    <div>
        <img src=“img.jpg” alt=“test”/>
        <p>Link Test</p>
    </div>
</a>

当然这个例子很愚蠢,但它是有效的商业案例。

道歉我在这里无法附加代码,因为我现在在公共汽车上疯狂打字。我先尝试过使用。最后。 ,但不知何故,变量不能跨行传递。

你可以在这提出建议吗?

3 个答案:

答案 0 :(得分:0)

这是执行此操作的一种方法,使用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;

答案 1 :(得分:0)

试试这个:

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;  

答案 2 :(得分:0)

因此,您希望将COLOUR的非缺失值应用于具有相同值FRUIT的每条记录?听起来像一个简单的MERGE问题。

data YYY;
  merge XXX(drop=colour) XXX(keep=fruit colour where=(not missing(colour)));
  by fruit;
run;