Merge 按数字范围合并
我想根据一个范围而不是一个明确的数字将一个人的名字分配给一个数字。使用格式可以做到这一点,但由于我在数据集中有名称,我宁愿避免手动编写Merge 按数字范围合并,merge,range,sas,Merge,Range,Sas,我想根据一个范围而不是一个明确的数字将一个人的名字分配给一个数字。使用格式可以做到这一点,但由于我在数据集中有名称,我宁愿避免手动编写proc格式 data names; input low high name $; datalines; 1 10 John 11 20 Paul 21 30 George 31 40 Ringo ; data numbers; input number; datali
proc格式
data names;
input low high name $;
datalines;
1 10 John
11 20 Paul
21 30 George
31 40 Ringo
;
data numbers;
input number;
datalines;
33
21
17
5
;
所需输出为:
data output;
input number name $;
datalines;
33 Ringo
21 George
17 Paul
5 John
;
谢谢您的帮助。您可以使用PROC SQL这样做:
proc sql;
create table output as
select numbers.number, names.name
from numbers left join names
on numbers.number ge names.low
and numbers.number le names.high
;
quit;
我认为SQL确实更简洁,但如果您不太喜欢它,并且数字以已知的增量出现,您可以尝试以下方法:
data ranges;
set names;
do number = low to high; /* by ... */
output;
end;
proc sort;
by number;
run;
data output;
merge ranges
numbers ( in = innum )
;
by number;
keep number name;
if innum;
run;
同样,它要求数字以预定的增量出现,例如整数。proc format的一个方便功能是能够使用数据集创建格式,而不是手动键入。您的场景似乎是此功能的完美场景 在您给出的示例中,对“名称”数据集进行一些小的更改将使其成为可以通过proc格式读取的形式 例如,如果我这样修改名称数据集
data names;
retain fmtname "names" type "N";
input start end label $;
datalines;
1 10 John
11 20 Paul
21 30 George
31 40 Ringo
;
然后,我可以发出此命令以基于它构建格式
proc format cntlin=names;run;
现在我可以使用这种格式,就像你使用任何其他格式一样。例如,要根据编号创建包含所需“名称”的新列,可以执行以下操作:
data numbers;
input number;
number_formatted=put(number,names.);
datalines;
33
21
17
5
;
以下是输出的内容:
number_
number formatted
33 Ringo
21 George
17 Paul
5 John
更新以解决问题: 从文本文件读取所需的编码没有太大区别。我们只需要对其进行设置,以便输出数据集具有proc format所期望的特定变量名(fmtname、type、start、end和label) 例如,如果我有一个名为“names.csv”的外部逗号分隔文件,该文件如下所示:
1,10,John
11,20,Paul
21,30,George
31,40,Ringo
data names;
retain fmtname "names" type "N";
infile "<path to file>/names.csv" dsd;
input start end label $;
run;
然后,我可以简单地更改创建“名称”数据集的代码,使其如下所示:
1,10,John
11,20,Paul
21,30,George
31,40,Ringo
data names;
retain fmtname "names" type "N";
infile "<path to file>/names.csv" dsd;
input start end label $;
run;
很高兴有一个非SQL选项。太棒了。我怀疑有一种方法可以使用数据集作为格式。然而,有一个问题;我有一个外部csv格式的数据集,可以很好地读取SAS数据集,但我无法从数据集创建格式,只能使用“数据线”方法。您能推荐使用现有SAS数据集创建格式的代码吗?太好了,这就是问题所在。只需要正确的变量名“start、end和label”。再次感谢。