SAS PROC TABULATE:基于细胞值的颜色

时间:2013-08-22 16:39:25

标签: sas

我在SAS中输出了两个交叉表:一个用于Time0,另一个用于Time1。我很有兴趣比较第一个交叉表中每个单元格的值与第二个交叉表中的值的变化。

是否有一种聪明的方法可以根据与另一个交叉表中的等效单元格进行比较来更改单元格的背景颜色?如果没有,并且我创建了一个变量,其中变量在Time0和Time1之间变化,我如何根据值是正还是负来更改交叉表的单元格颜色?如果单元格包含百分比变化,是否可以以5%的增量放置颜色渐变?

我有一些示例数据如下:

data have;
    input username $  betdate : datetime. stake;
    dateOnly = datepart(betdate) ;
    format betdate DATETIME.;
    format dateOnly ddmmyy8.;
    datalines; 
    player1 12NOV2008:12:04:01 90
    player1 04NOV2008:09:03:44 30
    player2 07NOV2008:14:03:33 120
    player1 05NOV2008:09:00:00 50
    player1 05NOV2008:09:05:00 30
    player1 05NOV2008:09:00:05 20
    player2 09NOV2008:10:05:10 10
    player2 15NOV2008:15:05:33 35
    player1 15NOV2008:15:05:33 35
    player1 15NOV2008:15:05:33 35
    run;

proc sort data=have; by username betdate; run;

data have;
    set have;
    by username dateOnly betdate;   
    retain eventTime;
    if first.username then eventTime = 0;
    if first.betdate then eventTime + 1;
run;

proc sql;
    create table playerStats as 
    select 
    distinct username,
    (select distinct avg(stake) from have where username = main.username and eventTime <= 1) format comma10.2 as bet1AvgStake,
    (select distinct avg(stake) from have where username = main.username and eventTime <= 2) format comma10.2 as bet2AvgStake,
    (select distinct avg(stake) from have where username = main.username and eventTime <= 3) format comma10.2 as bet3AvgStake
    from have main;
quit;

Proc rank data=playerStats ties=mean out=customerStats groups=2;
    var     bet1AvgStake bet2AvgStake;
    ranks   bet1AvgStakeRank bet2AvgStakeRank;
run;

PROC TABULATE DATA=customerStats NOSEPS;
    VAR bet1AvgStake bet2AvgStake;
    class bet1AvgStakeRank;
    TABLE bet1AvgStakeRank, bet1AvgStake*(N Mean);
    TABLE bet1AvgStakeRank, bet2AvgStake*(N Mean);
RUN;

当第二个交叉表中每个单元格中的值低于第一个交叉表中的等效单元格时,我希望看到一个红色单元格,当值更高时,我希望看到一个绿色单元格。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

我认为你不能在一个过程中做到这一切,但如果我理解得当你肯定可以做第二部分。它更普遍地被称为“交通照明”,以帮助谷歌搜索更详细的信息;例如,this paper有一些如何操作的例子。

通常,概念是您创建一种格式,其标签是一种颜色:

proc format; 
 value betfmt 
    low - -5= 'red' 
    -5 >-> 0 = 'lightred'
    0 - 5 ='lightgreen'
     5 >- high = 'green'; *or hex values like 'cxFF0099';
quit;

然后在proc表格中使用该格式:

proc tabulate data=yourdata;
var bets;
tables bets/style=[background=betfmt.];
run;

它确实需要基于当前的单元格;如果不使用PROC REPORT,则无法根据其他单元格进行计算。