我有一个包含三个字段的表:水果,颜色和等级。对于所有水果,等级为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
任何人都可以帮忙吗?
非常感谢!
答案 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;