使用“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;
答案 0 :(得分:1)
答案 1 :(得分:0)
我不认为在proc手段中有任何方法可以实现这一点。有各种方法可以使用各种其他过程。单变量过程使用极端观测强调了一种方法。
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)
按升序对值排序。删除第一个值。这将是最小值。现在,第一个位置留下的值是你的第二个最小值。