Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
水平组合三个SAS数据集,并重命名列_Sas_Proc Sql - Fatal编程技术网

水平组合三个SAS数据集,并重命名列

水平组合三个SAS数据集,并重命名列,sas,proc-sql,Sas,Proc Sql,我在《SAS企业指南》中工作,希望将三个独立的数据集合并为一个数据集。所有数据集都有一个具有相同长度、数据类型和列标题的列: 我的数据如下所示(三个表,每个表1列): 我希望我的输出数据如下所示(一个表,3列)。列标题应更改为我选择的名称: output_data green_apples red_apples yellow_apples 100 200 300 55 77 80 3422

我在《SAS企业指南》中工作,希望将三个独立的数据集合并为一个数据集。所有数据集都有一个具有相同长度、数据类型和列标题的列:

我的数据如下所示(三个表,每个表1列):

我希望我的输出数据如下所示(一个表,3列)。列标题应更改为我选择的名称:

output_data

green_apples  red_apples   yellow_apples
100           200          300
55            77           80
3422          32432        1234 
我对SAS merge语句和proc_sql进行了处理,但从我所看到的情况来看,我总是需要添加一些公共标识符(对于BY语句或类似的语句)

有没有一种快速的方法来做我想做的事

首先谢谢你的帮助

data want;
  merge a(rename=apples=green_apples) 
        b(rename=apples=red_apples) 
        c(rename=apples=yellow_apples)
  ;
run;
正如您所说的那样,通过语句将数据集合并到一起。有一个选项(
options mergenoby=ERROR | WARN | NOWARN
)可能会使此语句出错或产生警告(因为这是经常出错的事情),但您可以将其转到
NOWARN
,以避免出现这种情况


在SQL中,如果不创建一个人工的行标识符,就没有一个好方法可以做到这一点。

一个快速而肮脏的解决方案可以完全匹配您发布的内容:

data output_data;
    set data1 (rename=(apples = green_apples));
    set data2 (rename=(apples = red_apples));
    set data3 (rename=(apples = yellow_apples));
run;
请记住,此解决方案将受到最小数据集中观测数量的限制

但是,您似乎希望按照记录在数据集中出现的顺序来匹配这些记录?如果是这样,描述顺序的标识符字段将很有用(例如,如果数据集具有不同的观察计数)。一种方法是使用
自动变量:

/*
    Changing observation counts
*/
data data1;
    id = _N_;
    input apples 8.;
    cards;
100
55
3422
;
run;

data data2;
    id = _N_;
    input apples 8.;
    cards;
200
77
32432
1
2
;
run;

data data3;
    id = _N_;
    input apples 8.;
    cards;
300
80
1234 
5
;
run;

data output_data;
    merge data1 (in=d1 rename=(apples = green_apples))
          data2 (in=d2 rename=(apples = red_apples))
          data3 (in=d3 rename=(apples = yellow_apples));
    by id;
    if d1 or d2 or d3;
run;

这里,数据集选项
(in=d1…
创建一个临时变量
d1
,如果
data1
中的记录与
data2
data3
中的记录通过
id

匹配,则将其设置为
1
,这是有意义的,但不允许我重命名列标题。此外,您可能需要说明这是否是一个tim这类事情,或者你想以一种可复制的、模块化的方式来做的事情。现在有更复杂的解决方案,它们更适合你需要灵活的事情,但对于一次性的情况来说是多余的。这只是一次性的事情,所以这是完美的。非常感谢!
如果d1、d2或d3
是pointless,这是默认值。(一条记录如何出现在输出数据集中,而不是来自三个数据集中的一个?)
set
选项是一种可能的解决方案,但是您应该明确地提到它和merge之间的主要区别——SAS将如何处理不同大小的数据集。这一点很好。
if
语句和
in
选项旨在显示SAS的思维方式,基于这个问题,它看起来像是OP n需要一些背景知识。另外,
set
解决方案将受到第一个数据集中观察值数量的限制。我建议将其放在答案中,而不是放在评论中。事实上-你错了一件事,我误读了你的评论。观察值的数量不受第一个数据集的限制。它受最小的数据集。(因此,如果d1和d2有100个数据集,而d3有50个数据集,则会得到50个数据集。)当任何
set
语句检索到一行失败时,数据步骤结束。
/*
    Changing observation counts
*/
data data1;
    id = _N_;
    input apples 8.;
    cards;
100
55
3422
;
run;

data data2;
    id = _N_;
    input apples 8.;
    cards;
200
77
32432
1
2
;
run;

data data3;
    id = _N_;
    input apples 8.;
    cards;
300
80
1234 
5
;
run;

data output_data;
    merge data1 (in=d1 rename=(apples = green_apples))
          data2 (in=d2 rename=(apples = red_apples))
          data3 (in=d3 rename=(apples = yellow_apples));
    by id;
    if d1 or d2 or d3;
run;