我的问题很简单。如果数据如下,
var1 var2 var3
10 40 60
15 10 5
我想添加一个新列MaxValueVar
,它返回var1
,var2
和var3
中具有最大值的列的索引。也就是说,我想制作如下表格。
var1 var2 var3 MaxValueVar
10 40 60 3
15 10 5 1
在R中,我会使用:
apply(vector, 1, which.max)
如何使用SAS实现此目的?
答案 0 :(得分:4)
根据您在此处提供的示例,提供一种解决方案供您参考。你没有提到如何处理关系。这里为tie,第一次出现。
data test;
input var1 var2 var3;
datalines;
10 40 60
15 10 5
run;
data test;
set test;
maxvalue=max(of var1-var3);
maxvaluevar=0;
array vars (*) var1-var3;
do i=1 to dim(vars);
if maxvaluevar=0 then maxvaluevar=i*(maxvalue=vars(i))+maxvaluevar;
end;
drop i maxvalue;
run;
答案 1 :(得分:2)
这是与罗比相似的解决方案。除了数组中的索引之外,它还使用vname()
函数来获取第一个最大值的变量名。
data maxarr (drop=i);
input var1 var2 var3;
array vars(*) var1-var3;
max=max(of vars(*));
do i=1 to dim(vars);
if vars(i)=max then do;
MaxValueIndx=i;
MaxValueVar=vname(vars(i));
leave;
end;
end;
datalines;
10 40 60
15 10 5
;
run;
proc print data=maxarr noobs;run;
答案 2 :(得分:2)
下面的代码应按预期工作,并在有关系的实例中创建更多列。我知道你说不要打扰,但这让我烦恼!
输入测试数据:
data test;
input var1 var2 var3;
cards;
10 40 60
15 10 5
7 8 9
13 13 10
5 7 6
10 11 12
10 10 10
1 3 2
3 3 1
;
run;
检查最大值的代码:
data test (drop = i howmanymax);
set test;
retain howmanymax;
howmanymax=0;
array varlist[*] var1--var3;
array maxnum[3];
do i = 1 to DIM(varlist);
if varlist[i] = max(of var1--var3)
then do;
howmanymax+1;
maxnum[howmanymax] = i;
end;
end;
run;
输出如下:
var1 var2 var3 nummax1 nummax2 nummax3
10 40 60 3 . .
15 10 5 1 . .
7 8 9 3 . .
13 13 10 1 2 .
5 7 6 2 . .
10 11 12 3 . .
10 10 10 1 2 3
1 3 2 2 . .
3 3 1 1 2 .