保留顶行

时间:2016-04-05 16:19:37

标签: sas retain

我有一个包含三个字段的表:水果,颜色和等级。对于所有水果,等级为1.

我的问题是:

对于所有1年级的作品,我想保留第一行的第一种颜色。但如果同一种水果显示两次,那么保留这种水果的第二种颜色用于其余的记录。

表1:

Fruit      Color   Grade
------------------------
Apple      Green   1
Apple      Red     1
Cherry     Yellow  1 
Strawberry Yellow  1

理想表2:

Fruit      Color   Grade
------------------------
Apple      Green   1
Apple      Red     1
Cherry     Red     1
Strawberry Red     1 

任何人都可以帮忙吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以使用 i1 <- dt[,{x1 <- paste(pmin(x,y), pmax(x,y)) duplicated(x1)|duplicated(x1, fromLast=TRUE) }] dt[i1] dt[!i1] retain来实现此目的。我倾向于避免使用lag,所以这是使用lag的解决方案。

请注意,我没有考虑成绩,因为你指定它的水果总是1,我们不希望在名为的列中找到除水果以外的任何其他东西。水果!

retain

使用data table1; length fruit $ 12 Color $ 12; input Fruit Color Grade; datalines; Apple Green 1 Apple Red 1 Cherry Yellow 1 Strawberry Yellow 1 Strawberry Pink 1 Banana Yellow 1 run;

retain

结果

data table2(drop=tmp_fruit);
  format tmp_fruit $12. Fruit $12. Color $12. Grade 1.;
  retain tmp_fruit '' Color '' ;
  set table1(rename=(Color=old_color));

  * Initialize values of retained variables;
  if _N_ = 1 then do;
    Color = old_color;
    tmp_fruit = Fruit;
  end;

  * Update tmp_fruit if necessary;
  if Fruit ne tmp_fruit then do;
    tmp_fruit = Fruit;
  end;

  * Modify Color if necessary;
  else if old_color ne Color then do;
    Color = old_color;
  end;
run;

修改

OP要求考虑成绩不是1的可能值。

只要数据按等级...

排序,这将有效
Fruit      Color   Grade  old_color 
-----------------------------------
Apple      Green   1      Green 
Apple      Red     1      Red 
Cherry     Red     1      Yellow 
Strawberry Red     1      Yellow 
Strawberry Pink    1      Pink 
Banana     Pink    1      Yellow 

结果:

data table1;
  length fruit $ 12 Color $ 12;
  input Fruit Color Grade;
  datalines;
Apple      Green   1
Apple      Red     1
Cherry     Yellow  1
Strawberry Yellow  1
Strawberry Pink    1
Banana     Yellow  1
Kiwi       Green   1
Bicycle    Golden  2
Carpet     Brown   2
Doughnut   White   3
run;

data table2(drop=tmp_fruit);
  format tmp_fruit $12. Fruit $12. Color $12. Grade 1.;
  retain tmp_fruit '' Color '';
  set table1(rename=(Color=old_color));

  * Initialize values of retained variables;
  if _N_ = 1 then do;
    Color = old_color;
    tmp_fruit = Fruit;
    tmp_grade = Grade;
  end;

  * Update tmp_fruit if necessary;
  if Fruit NE tmp_fruit and Grade EQ 1 then do;
    tmp_fruit = Fruit;
  end;

  * Modify Color if necessary;
  else if old_color ne Color and Grade EQ 1 then do;
    Color = old_color;
  end;

  * For grades other than 1;
  else Color = old_color;
run;