我是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,依此类推。我试着看宏和&但是,我还没有找到解决方案,我们将不胜感激。谢谢!
另外,请原谅我缺乏论坛写作经验和任何缺乏正确的格式。希望它仍然很容易理解。
答案 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 join
,right join
或full join
。