Indexing SAS:如何基于字符串变量创建索引变量?

Indexing SAS:如何基于字符串变量创建索引变量?,indexing,sas,Indexing,Sas,我想创建一个顺序索引变量。例如,我有独特的网站和网站内的部分: 站点1 2 3 3 A、B节 场地剖面组合是独特的。我想要一个唯一的顺序索引变量,这样站点1,部分a=1,站点1,部分B=2,站点2,部分a=3,依此类推 站点1 2 3 3 A、B节 指数123456 我试过先用。最后。带do循环的函数,我就是搞不懂。无论如何,我对do循环不是很在行。谢谢你的帮助 我不知道如何使用do循环来实现这一点,但显然可以使用proc sort和data merge来实现。创建仅保留用于创建索引的分类变量的

我想创建一个顺序索引变量。例如,我有独特的网站和网站内的部分:

站点1 2 3 3

A、B节

场地剖面组合是独特的。我想要一个唯一的顺序索引变量,这样站点1,部分a=1,站点1,部分B=2,站点2,部分a=3,依此类推

站点1 2 3 3

A、B节

指数123456


我试过先用。最后。带do循环的函数,我就是搞不懂。无论如何,我对do循环不是很在行。谢谢你的帮助

我不知道如何使用do循环来实现这一点,但显然可以使用proc sort和data merge来实现。创建仅保留用于创建索引的分类变量的数据集,然后使用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;

我不知道如何使用do循环来实现这一点,但显然可以使用proc sort和数据合并来实现。创建仅保留用于创建索引的分类变量的数据集,然后使用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;

您的解决方案是完全合理的,尤其是当您不确定是否只有site section的唯一值时。如果您确定它们是唯一的(因此,NODUPRECS不会删除任何内容),那么您可以简化它并删除合并:

data final;
set dataset;
sectionIndex+1;
run;
如果希望数据步骤按正确顺序排列,可以选择在数据步骤之前进行排序

如果要避免合并(如果数据集非常大),并且不确定它们是否唯一,则可以执行以下操作:

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循环或类似的事情)。

你的解决方案是完全合理的,特别是如果你不确定站点部分是否只有唯一的值。如果您确定它们是唯一的(因此,NODUPRECS不会删除任何内容),那么您可以简化它并删除合并:

data final;
set dataset;
sectionIndex+1;
run;
如果希望数据步骤按正确顺序排列,可以选择在数据步骤之前进行排序

如果要避免合并(如果数据集非常大),并且不确定它们是否唯一,则可以执行以下操作:

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循环或类似的事情)。

如果我可以对样式进行评论,你可以做一件简单的事情,让代码更健壮、更可读,那就是在每个步骤中添加RUN语句。虽然它们实际上不是必需的,但通常在每个数据和过程步骤之后运行是一个好习惯(除了那些以退出结束的步骤,如procsql)。使它更具可读性(因为一个步骤在哪里结束,下一个步骤在哪里开始)和可维护性(例如,如果您只需要测试一个步骤)。如果我可以对样式进行评论,您可以做一件简单的事情,使代码更健壮,更具可读性,就是在每个步骤中添加RUN语句。虽然它们实际上不是必需的,但通常在每个数据和过程步骤之后运行是一个好习惯(除了那些以退出结束的步骤,如procsql)。使它更具可读性(因为一个步骤的结束和下一个步骤的开始更加清晰),并且更易于维护(例如,如果您只需要测试一个步骤)。