SAS第二小的价值

时间:2015-12-10 21:54:02

标签: sas enterprise-guide

使用“SAS Enterprise Guide”中的“摘要统计”任务构建的以下代码可查找表的每列的最小值。

如何找到第二个最小值? 我尝试用SMALLEST替换MIN(2)但是没有工作。

谢谢。

TITLE;
TITLE1 "Summary Statistics";
TITLE2 "Results";
FOOTNOTE;
FOOTNOTE1 "Generated by the SAS System (&_SASSERVERNAME, &SYSSCPL) on 
%TRIM  (%QSYSFUNC(DATE(), NLDATE20.)) at 
%TRIM(%SYSFUNC(TIME(), TIMEAMPM12.))";
PROC MEANS DATA=WORK.SORTTempTableSorted
NOPRINT
CHARTYPE

    MIN NONOBS  ;
VAR A B C;

OUTPUT  OUT=WORK.MEANSummaryStats(LABEL="Summary Statistics for
WORK.QUERY_FOR_TRNSTRANSPOSEDPD__0001")

    MIN()=

/ AUTONAME AUTOLABEL INHERIT
;

RUN;

5 个答案:

答案 0 :(得分:1)

使用PROC UNIVARIATE的ExtremeValue表。

import { Component, View, bootstrap } from 'angular2/angular2';

enter image description here

答案 1 :(得分:0)

我不认为在proc手段中有任何方法可以实现这一点。有各种方法可以使用各种其他过程。单变量过程使用极端观测强调了一种方法。

https://support.sas.com/documentation/cdl/en/procstat/63104/HTML/default/viewer.htm#procstat_univariate_sect058.htm

title 'Extreme Blood Pressure Observations';
ods select ExtremeObs;
proc univariate data=BPressure;
   var Systolic Diastolic;
   id PatientID;
run;

proc print data=ExtremeObs;
run;

答案 2 :(得分:0)

我假设您对所有数字列感兴趣。如果由于数字变量的数量和名称的长度,IFLIST宏变量的长度超过64k字节,则此代码将失败。它适用于所有合理的窄数据集。

未经审查的代码

我们得到了数据集中的变量列表。

PROC CONTENTS DATA=SORTTempTableSorted OUT=md NOPRINT ;
RUN ;

我们使用该列表来创建语句和表达式。

IFLIST是一个语句块,用于在fieldname_1中存储fieldname的最小值,在fieldname_2中存储第二个最低值。如果比较是LT,那么我们保留不同的值,不一定是订单统计。如果比较是LE并且有多个观察值具有最小值,则fieldname_1和fieldname_2将彼此相等。我假设你想要不同的价值观。

MAXLIST是一个表达式,它将解析为数据集中的最大数值:)

创建MINLIST和MINLIST2以用于RETAIN和KEEP语句。

PROC SQL STIMER NOPRINT EXEC ;
  SELECT 'IF ' || name || ' LT ' || name '_1 THEN DO;' || 
                  name || '_2=' || name || '_1;' || 
                  name || '_1=' || name || ';END;ELSE IF ' || 
                  name || ' LT ' || name || '_2 THEN ' || 
                  name || '_2=' || name,
         'MAX(' || name || ')',
         name || '_1',
         name || '_2'
    INTO :iflist SEPARATED BY '; ',
         :maxlist SEPARATED BY '<>'
         :minlist SEPARATED BY ' ',
         :min2list SEPARATED BY ' '
    FROM md
    WHERE type EQ 1
  ;

现在我们从数据集中获取最大的数值:

  SELECT &maxlist
    INTO :maxval
    FROM SORTTempTableSorted
  ;

QUIT ;

现在我们开展工作。 END选项在最后一次观察时将“eof”设置为1,这是我们唯一想要将记录写入输出数据集的时间。

DATA min2 ;
  SET SORTTempTableSorted END=eof;
  RETAIN &minlist &min2list &maxval;
  KEEP &minlist &min2list ;
  &iflist ;
  IF eof THEN
    OUTPUT ;
RUN ;

答案 3 :(得分:0)

数据步骤解决方案,应该适用于任意数量的列,而不会遇到宏限制:

proc sql noprint;
  select count(*) into :NUM_COUNT from dictionary.columns
    where LIBNAME='SASHELP' and MEMNAME = 'CLASS' and TYPE = 'num';
quit;

data class_min2;
  do until(eof);
    set sashelp.class end = eof;
    array min2[&NUM_COUNT,2] _temporary_;
    array nums[*] _numeric_;
    do _n_ = 1 to &NUM_COUNT;
      min2[_n_,1] = min(min2[_n_,1],nums[_n_]);
      if min2[_n_,1] < nums[_n_] then min2[_n_,2] = min(nums[_n_],min2[_n_,2]); 
    end;
  end;
  do _iorc_ = 1 to 2;
    do _n_ = 1 to &NUM_COUNT;
      nums[_n_] = min2[_n_,_iorc_];
    end;
    output;
  end;
  keep _NUMERIC_;
run;

这会输出每个数字变量的两个最低不同值,而不会像proc univariate那样转换数据。您可以通过一些调整轻松地允许重复的最小值。

答案 4 :(得分:0)

按升序对值排序。删除第一个值。这将是最小值。现在,第一个位置留下的值是你的第二个最小值。