SAS表联合无键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAS表联合无键相关的知识,希望对你有一定的参考价值。

我有两个表,A和B,B是1 x 4表(Type,Freq,max,min),它是proc mean的输出。我想为每条记录添加max和min到表A,所以没有像a.key = b.key那样的语句,因为我只想在表A中添加相同数字的列。我该怎么办?

答案

您可以通过两种方式将摘要统计信息添加到原始数据集中,一种使用PROC SQL,另一种使用DATA步骤。下面有两个例子,一个考虑你是否有一个额外的分组变量,即你想加入特定Origin的所有汽车的总数和组平均值。

以下是两种方法的演示,这会增加平均值,但您可以将其扩展为轻松考虑其他统计信息。

******************************************************;
*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将无法在该数据集中找到第二个观察结果并在您预期之前终止datastep(尝试它!)。

data class_with_mean;
  set sashelp.class;
  if _n_=1 then set class_means(keep=weight_mean height_mean);
run;

以上是关于SAS表联合无键的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:JSON无键数组到列表

复合文字使用无键字段

在 Laravel 中仅返回值(无键/关联数组)

伪代码转换为SAS宏代码

json 地理排行榜测试无键

PHP json转换 无键名数据格式转换为有键名格式