我有一个类似于下面的数据集。基本上,我有三种不同尺寸的物品类型的当前价格。如果尺寸正确定价(即small<medium<large
)我想用“Y”标记它们并继续使用当前价格。如果它们的价格不正确,我想用“N”标记它们并使用建议的价格。我知道这可能是使用数组编程的时候了,但我的阵列技能肯定有点弱。有数百个位置,但只有一个项目类型。我目前在宏变量列表中加载了唯一的位置。
data have;
input type location $ size $ cur_price rec_price;
cards;
x NY S 4 1
x NY M 5 2
x NY L 6 3
x LA S 5 1
x LA M 4 2
x LA L 3 3
x DC S 5 1
x DC M 5 2
x DC L 5 3
;
run;
proc sql;
select distinct location into :loc_list from have;
quit;
非常感谢任何帮助。
感谢。
答案 0 :(得分:1)
我不知道数组在这里会有什么帮助。如何使用dif
排查最后一条记录的价格并进行验证(如果您愿意,还可以retain
最后一个价格)。确保数据集已正确排序by type location descending size
,然后:
data want;
set have;
by type location descending size; *S > M > L alphabetically;
retain price_check;
if not first.location and dif(cur_price) lt 0 then price_check=1;
*if dif < 0 then cur rec is smaller;
else if first.location then price_check=0; *reset it;
if last.location;
keep type location price_check;
run;
然后将其合并回原始数据集by type location
,并使用cur_price=1
的其他价格。
答案 1 :(得分:1)
不知道你为什么要在这里使用数组... proc transpose和一些数据步骤逻辑 可以轻松解决这个问题。数组是非常有用的(必须承认,我并非完全 他们也很舒服,但在你有这么多地方的情况下, 我认为转置更好。
以下代码是否可以实现您的目标?
/*sorts to get ready for transpose*/
proc sort data=have;
by location;
run;
/*transpose current price*/
proc transpose data=have out=cur_tran prefix=cur_price;
by location;
id size;
var cur_price;
run;
/*transpose recommended price*/
proc transpose data=have out=rec_tran prefix=rec_price;
by location;
id size;
var rec_price;
run;
/*merge back together*/
data merged;
merge cur_tran rec_tran;
by location;
run;
/*creates flags and new field for final price*/
data want;
set merged;
if cur_priceS<cur_priceM<cur_priceL then
do;
FLAG='Y';
priceS=cur_priceS;
priceM=cur_priceM;
priceL=cur_priceL;
end;
else do;
FLAG='N';
priceS=rec_priceS;
priceM=rec_priceM;
priceL=rec_priceL;
end;
run;
答案 2 :(得分:0)
或者你可以在一个查询中完成,这几乎是对你的要求的重新陈述。
Proc sql;
create table want as
select *
/* Basically, I have current prices for three different sizes of an item type.
If the sizes are priced correctly (ie small<medium<large) */
, case
when max ( case when size eq 'S' then cur_price end)
lt max ( case when size eq 'M' then cur_price end)
and max ( case when size eq 'M' then cur_price end)
lt max ( case when size eq 'L' then cur_price end)
/* I want to flag them with a “Y” and continue to use the current price */
then 'Y'
/* If they are not priced correctly,
I want to flag them with a “N” and use the recommended price. */
else 'N'
end as Cur_Price_Sizes_Correct
, case
when calculate Cur_Price_Correct eq 'Y'
then cur_price
else rec_price
end as Price
From have
Group by Type
, Location
;
Quit;