Sas 为同一组生成唯一ID
我有数据集Sas 为同一组生成唯一ID,sas,sas-macro,Sas,Sas Macro,我有数据集 CustID Rating 1 A 1 A 1 B 2 A 2 B 2 C 2 D 3 X 3 X 3 Z 4 Y 4 Y 5 M 6 N 7 O 8 U 8 T 8 U 预期产量 CustID Rating ID 1 A 1 1 A 1 1 B 1 2 A 1 2 B 2 2 C 3 2 D 4 3 X 1 3 X 1 3 Z
CustID Rating
1 A
1 A
1 B
2 A
2 B
2 C
2 D
3 X
3 X
3 Z
4 Y
4 Y
5 M
6 N
7 O
8 U
8 T
8 U
预期产量
CustID Rating ID
1 A 1
1 A 1
1 B 1
2 A 1
2 B 2
2 C 3
2 D 4
3 X 1
3 X 1
3 Z 2
4 Y 1
4 Y 1
5 M 1
6 N 1
7 O 1
8 U 1
8 T 2
8 U 1
在下面的解决方案中,我将不同的可能评级选择到一个宏变量中,以便在数组语句中使用。然后在ratings tolumn中搜索这些不同的值,以返回在每次成功查找时分配的编号 在这种情况下,可以通过将
%sysfunc
替换为3(不同评级的数量,如果您事先知道的话)来避免宏语句。但是如果您不知道的话,%sysfunc
语句有助于解决这个问题
data have;
input CustomerID Rating $;
cards;
1 A
1 A
1 B
2 A
2 A
3 A
3 A
3 B
3 C
;
run;
proc sql noprint;
select distinct quote(strip(rating)) into :list separated by ' '
from have
order by 1;
%put &list.;
quit;
如果您事先知道号码:
data want;
set have;
array num(3) $ _temporary_ (&list.);
do i = 1 to dim(num);
if findw(rating,num(i),'tips')>0 then id = i;
end;
drop i;
run;
否则:
%macro Y;
data want;
set have;
array num(%sysfunc(countw(&list., %str( )))) $ _temporary_ (&list.);
do i = 1 to dim(num);
if findw(rating,num(i),'tips')>0 then id = i;
end;
drop i;
run;
%mend;
%Y;
输出:
Obs CustomerID Rating id
1 1 A 1
2 1 A 1
3 1 B 2
4 2 A 1
5 2 A 1
6 3 A 1
7 3 A 1
8 3 B 2
9 3 C 3
假设数据按customerid和评级排序(如原始未编辑问题)。以下是您想要的:
data want;
set have;
by customerid rating;
if first.customerid then
id = 0;
if first.rating then
id + 1;
run;
到目前为止你试过什么?您可以添加该代码并询问什么不起作用以及您期望的是什么,因此这不是为了帮助您编写代码。您必须首先尝试。您需要每个评级的ID都是唯一的还是每个客户的每个评级的ID都是唯一的?例如,如果您有
CustomerID=4
和Rating=B
,您对Id
的期望是什么?这里的Id是1。我想知道,同一个客户是否分配了多个评级。@Chetan提供的答案不能解决您的问题吗?输出行1b1
是否应该1b2
。如果没有,请你解释一下为什么会像你所展示的那样。谢谢。谢谢,但它不起作用…有两个角度…一个是customerId和第二个评级…我想知道每个客户应该只有一个评级…如果同一个customerId重复相同的评级…那么它应该赋值1这如何反映在您在问题中提供的所需输出中?列ID在您的问题中出现在哪里?ID是计算列。如果我添加更多评分,它将不起作用。我已使用一些附加数据点更新了问题。您更新的问题与初始问题完全不同。你还没有解释你新问题背后的逻辑。如果你连自己的问题都无法描述,那么很难帮助你。我正忙着解决我的问题谢谢。如果工作正常,则得3分:1)请将答案标记为正确;2) 修正问题中的输出以符合您的要求,例如1b1
应该是1b2
;3) 正如您从所有评论中所看到的,您的问题中没有足够的信息,因此对所需逻辑的更详细描述意味着您可以更快地得到答案,例如,“在每个客户id
组中,对于评级的每个唯一值,增量id
”可能会有所帮助。我原本有另一个解决方案,因为我认为你想要一些不同的东西。