[英]SAS table joint without key
我有两个表,A和B,B是1 x 4个表(类型,频率,最大,最小),这是proc平均值的输出。 我想为每条记录的表A添加最大和最小值,因此没有像a.key = b.key这样的语句,因为我只想向表A添加相同编号的列。我该怎么办?
您可以通过两种方式将摘要统计信息添加到原始数据集中,一种是使用PROC SQL,另一种是使用DATA步骤。 下面有两个示例,其中一个示例考虑是否还有其他分组变量,即您想将特定来源的所有汽车的总数与组平均值相加。
这是这两种方法的演示,这会增加平均值,但是您可以扩展平均值以轻松说明其他统计信息。
******************************************************;
*Add average value to a dataset;
*Solution 1 - PROC MEANS + Data step;
******************************************************;
proc means data=sashelp.class noprint;
output out=avg_values mean(height)=avg_height;
run;
data class_data;
set sashelp.class;
if _n_=1 then
set avg_values;
run;
proc print data=class;
run;
*Solution 2 - PROC SQL - note the warning in the log;
PROC SQL;
Create table class_sql as
select *, mean(height) as avg_height
from sashelp.class;
quit;
******************************************************;
*Add average value to a dataset - with grouping variables;
*Solution 1 - PROC MEANS + Data step;
******************************************************;
proc means data=sashelp.class noprint nway;
class sex;
output out=avg_values mean(height)=avg_height;
run;
*sort data before merge;
proc sort data=sashelp.class out=class;
by sex;
run;
data class_data;
merge class avg_values;
by sex;
run;
proc print data=class_data;
run;
*Solution 2 - PROC SQL - note the warning in the log;
PROC SQL;
Create table class_sql as
select *, mean(height) as avg_height
from sashelp.class
group by sex;
quit;
将单个变量添加到所有列的标准方法不是合并,而是set语句。 这利用了以下事实:默认情况下,SAS将保留通过SET / MERGE / UPDATE进入的数据集中的所有变量; 只要您使用分支(IF / THEN)来防止SAS在数据集为空时尝试读取它,它就会做您想要的事情。
例如,您有SASHELP.CLASS,并且想要附加平均身高/体重。 您首先具有proc means
:
proc means data=sashelp.class noprint;
var height weight;
output out=class_means mean= /autoname;
run;
然后,使用set
语句,并在其周围加上if _n_ = 1
子句,以确保仅在第一次迭代中执行该语句。 如果不进行此设置,SAS将无法在该数据集中找到第二个观测值,并在您期望之前终止数据步骤(尝试!)。
data class_with_mean;
set sashelp.class;
if _n_=1 then set class_means(keep=weight_mean height_mean);
run;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.