Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS PROC表格:基于单元格值的颜色_Sas - Fatal编程技术网

SAS PROC表格:基于单元格值的颜色

SAS PROC表格:基于单元格值的颜色,sas,Sas,我在SAS中输出了两个交叉选项卡:一个用于Time0,另一个用于Time1。我对比较第一个交叉表和第二个交叉表中每个单元格的值变化很感兴趣 有没有一种聪明的方法可以通过与另一个交叉表中的等效单元格进行比较来更改单元格的背景颜色?如果不是,并且我创建了一个变量,变量的变化在时间0和时间1之间,我如何根据值是正值还是负值来更改交叉表的单元格颜色?如果单元格包含百分比变化,是否可以以5%的增量设置颜色渐变 我有一些样本数据如下: data have; input username $ bet

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

有没有一种聪明的方法可以通过与另一个交叉表中的等效单元格进行比较来更改单元格的背景颜色?如果不是,并且我创建了一个变量,变量的变化在时间0和时间1之间,我如何根据值是正值还是负值来更改交叉表的单元格颜色?如果单元格包含百分比变化,是否可以以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;
当第二个交叉表中的每个单元格的值低于第一个交叉表中的等效单元格时,我希望看到一个红色单元格,当值较高时,看到一个绿色单元格


谢谢你在这方面的帮助

我不认为你可以在一个过程中完成所有这些,但如果我理解正确,你当然可以完成第二部分。一般称之为交通灯,帮助谷歌搜索更详细的信息;例如,有一些例子说明了如何做到这一点

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

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,您无法基于另一个单元格进行计算。

使用PROC REPORT进行计算怎么样?添加一个计算块来实现这一点很容易。不过,我读得不太清楚。我认为要做到这一点,您必须使用proc TABLATE创建一个输出数据集,在那里进行比较,在您想要突出显示的内容上生成某种标志变量,然后用proc report打印出来,并进行着色处理。