2012-10-19 119 views
1

我想创建一个顺序索引变量。例如,我有位点中是唯一的位点和部分:SAS:如何基于字符串变量创建索引变量?

站点1 1 2 2 3 3

部分A B A B A B

网站截面组合是唯一的。我想要一个唯一的顺序索引变量,以便站点1的A部分= 1和站点1的B = 2部分以及站点2的部分A = 3,依此类推。

站点1 1 2 2 3 3

部分A B A B A B

指数1 2 3 4 5 6

我已经使用第一次尝试。最后。函数与循环,我只是无法弄清楚。无论如何,我对循环不太好。谢谢你的帮助!

回答

0

我不知道如何用do循环做到这一点,但显然它可以使用proc排序和数据合并来完成。创建仅保留用于创建索引的分类变量的数据集,然后使用noduprescs进行排序以删除重复项。使用+1添加索引变量。然后合并回原始数据集。

data sitesections; 
set dataset; 
keep site section; 

proc sort data=sitesections out=sitesections2 noduprecs; 
by site section; 

data sitesections_final; 
set sitesections2; 
sectionindex +1; 

data final; 
merge sitesections_final dataset; 
by site section; 
run; 
+2

如果我可以评论风格 - 你可以做的一件简单的事情,使你的代码更健壮,更可读的是添加RUN语句到你的每一个步骤。虽然它们实际上并不是必需的,但在每个DATA和PROC步骤后都运行RUN(通常在QUIT中结束的那些除外,如PROC SQL)通常是一个好习惯。使其更易读(因为它更清楚一步到底和下一步开始的位置),并且更易于维护(例如,如果您只需测试一个步骤)。 – Joe

1

你的解决方案是完全合理的,特别是如果你不能确定是否有唯一的站点段的唯一值。如果你确信它们是唯一的(所以,NODUPRECS不会删除任何东西),然后可以将其简化和删除合并:如果你想让他们在正确的顺序

data final; 
set dataset; 
sectionIndex+1; 
run; 

的datastep之前可选的排序。

如果你想避免合并(如果该数据集是非常大的),而你不知道它们是唯一的,那么你可以做:

proc sort data=dataset; 
by site section; 
run; 

data final; 
set dataset; 
by site section; 
if first.section then sectionIndex+1; 
run; 

这并不需要NODUPRECS或NODUPKEY,和节省一些处理时间。

我不认为DO循环将是有益的,除非你正在做一些更复杂(需要一个DOW循环或类似的东西)。