Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Merge 按数字范围合并_Merge_Range_Sas - Fatal编程技术网

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”。再次感谢。