SAS:连接来自多个数据集的变量

时间:2013-12-05 21:21:04

标签: sql join dataset concatenation sas

我是SAS的新用户,最近出现的问题如下:

我目前有两个数据集:Year_1& Year_2。

示例:

Year_1

*Name.....Q1 ..... Q2.....Q3.....Q4*
Andrew....1 ........0.........1........0
Anson......1..........1..........0........1

Year_2

*Name.....Q1 ..... Q2.....Q3.....Q4*
Andrew....1 .........1.........0.........0
Anson......0..........1..........0........1

我尝试做的是在连接值(尤其是Q1-Q4)时加入 Name (唯一标识符)上的以下表格,以产生:

Both_Years

*Name.....Q1 ..... Q2.....Q3.....Q4*
Andrew....11 ......01........10.....00
Anson......10.......11.......00.......11

由于安德鲁在Q1年1月获得1分,在第1年第1季获得1分,因此最终结果将是11,依此类推。我试着看宏和&但是,我还没有找到解决方案,我们将不胜感激。谢谢!

另外,请原谅我缺乏论坛写作经验和任何缺乏正确的格式。希望它仍然很容易理解。

3 个答案:

答案 0 :(得分:0)

您需要立即访问这两行。您可以在datastep中执行以下两种方法之一;将数据集合并或设置在一起。在这种情况下,合并有点棘手,因为你有同名的变量;你必须rename将它们变成不同的东西,否则它们只会被覆盖。

例如:

data  merged;
merge year_1(rename=(q1=q1y1 q2=q2y1 q3=q3y1 q4=q4y1) in=y1) 
      year_2(rename=(q1=q1y2 q2=q2y2 q3=q3y2 q4=q4y2) in=y2);
by name;
if y1 and y2; *or some other logic - this would include only records found in both years 
*remove the above line if all combinations of matches or non-matches are okay;
q1=cats(of q1:);
q2=cats(of q2:);
q3=cats(of q3:);
q4=cats(of q4:);
run;

cats连接,of允许以空格分隔的变量列表; :是通配符,因此所有内容都以q1开头。

你也可以使用set:

data set_together;
set year_1 year_2;
by name;
retain q1_c q2_c q3_c q4_c; *save the value from each iteration;
if first.name then do; *for a new name, clear out the markers;
call missing(of q1_c q2_c q3_c q4_c); *clear them out;
end;
q1_c = cats(q1_c,q1);
q2_c = cats(q1_c,q1);
q3_c = cats(q1_c,q1);
q4_c = cats(q1_c,q1);
if last.name then output; *keep only last row for each name;
run;

如果你想在最终文件中保留q1样式名称,你当然可以在这里使用RENAMES。

两者都要求数据集按name排序。

您也可以使用PROC SQL来执行此操作:

proc sql;
create table want as select y1.name, cats(year1.q1,year2.q1) as q1, cats(year1.q2,year2.q2) as q2, cats(year1.q3,year2.q3) as q3, cats(year1.q4,year2.q4) as q4
from year_1 y1, year_2 y2
where y1.name=y2.name;
quit;

答案 1 :(得分:0)

您需要合并数据集以在一个位置获取所需的所有内容,然后使用连接函数将所有内容整合到一个变量中。连接将生成一个字符串,因此如果您需要保留数字的答案,则需要在连接后将它们转换回数字。这里有一些代码可以解决这个问题:

proc sort data = year_1;
    by name;
run;

proc sort data = year_2;
    by name;
run;

data both_years;
    merge year_1 (rename = (Q1=Q1_1 Q2=Q2_1 Q3=Q3_1 Q4=Q4_1))
          year_2 (rename = (Q1=Q1_2 Q2=Q2_2 Q3=Q3_2 Q4=Q4_2));
    by name;
    format Q1-Q4 $20.;
    Q1 = cat(Q1_1,Q1_2);
    Q2 = cat(Q2_1,Q2_2);
    Q3 = cat(Q3_1,Q3_2);
    Q4 = cat(Q4_1,Q4_2);

    keep name Q1-Q4;
run;

答案 2 :(得分:0)

您可以使用proc sql执行此操作。假设两个表中都有相同的名称列表:

proc sql;
    select t1.name,
           (t1.Q1||t2.Q1) as Q1,
           (t1.Q2||t2.Q2) as Q2,
           (t1.Q3||t2.Q3) as Q3,
           (t1.Q4||t2.Q4) as Q4
    from table1 t1 join
         table2 t2
         on t1.name = t2.name;

如果名称列表不同,那么您可能需要left joinright joinfull join