Sas 如何创建将值与同一列的总平均值进行比较的二进制列,以便如果nb>;平均值=1&;注意<;平均值=0

Sas 如何创建将值与同一列的总平均值进行比较的二进制列,以便如果nb>;平均值=1&;注意<;平均值=0,sas,datastep,Sas,Datastep,我正在处理一项任务&不允许使用PROC-SQL&必须使用DATA-STEP或其他PROC。我有一个数据集(表a)&我试图同时计算一些东西,在r/sas、stackoverflow和YouTube上花了几个小时之后,我还没有接近我的答案。我需要在表a中创建一个二进制列,如果第3列中的值>=第3列的平均值,则该列=1,但按国家分组。在PROC SQL中,它非常简单: PROC SQL; CREATE TABLE Earl.A AS SELECT * , CASE WHEN A.new_cases

我正在处理一项任务&不允许使用PROC-SQL&必须使用DATA-STEP或其他PROC。我有一个数据集(表a)&我试图同时计算一些东西,在r/sas、stackoverflow和YouTube上花了几个小时之后,我还没有接近我的答案。我需要在表a中创建一个二进制列,如果第3列中的值>=第3列的平均值,则该列=1,但按国家分组。在PROC SQL中,它非常简单:

PROC SQL;
CREATE TABLE Earl.A AS

SELECT * ,
CASE WHEN A.new_cases > AVG(A.new_cases) 
THEN 1 ELSE 0
END AS Global_Average_Comparison
FROM Earl.A AS A
QUIT;
但在SAS数据步骤中……我感觉有点像头灯里的鹿。我尝试使用PROC MEANS,但这会创建一个新表&任何将其合并回表a的尝试都会返回我在以前的查询中删除的不相关的列:

PROC MEANS DATA=EARL.A;
    BY country;
    VAR new_cases;
output out=means(drop=_type_ _freq_) mean=mean;
RUN;
我对SAS数据步骤非常陌生,但精通SQL:(因此,任何指导都将不胜感激


谢谢!

您没有显示合并的尝试,但是过程非常简单

例如:

data have;
  call streaminit(123);
  do country = 'A', 'B', 'C';
  do _n_ = 1 to 100 + rand('integer',50);
    x = rand('integer', 25, 75);
    output;
  end;
  end;
run;

proc means noprint data=have;
  by country;
  var x;
  output out=means(keep=country x_mean) mean=x_mean;
run;

data want;
  merge have means;
  by country;

  above_average_flag = x > x_mean;

  * drop x_mean;
run;

忘记在PROC SQL中按国家添加组…合并不会返回已删除的变量。除非您正在与未删除变量的旧数据集合并。如何向数据集添加摘要统计信息。或查找DoW循环。