2013-08-22 2 views
0

У меня есть два кросс-вклада, выводимых в SAS: один для Time0 и один для Time1. Мне интересно сравнить изменение значений в каждой из ячеек в первой кросс-таблице с показателями второго.SAS PROC TABULATE: цвет, основанный на значении ячейки

Есть ли умный способ изменить цвет фона ячейки на основе сравнения с эквивалентной ячейкой в ​​другой кросс-вкладке? Если нет, и я создаю переменную с изменением переменной между 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; 

Я хотел бы видеть красную клетку, когда значение в каждой ячейке во второй перекрестной таблице ниже, чем эквивалентные ячейки в первом и зеленую клетку когда значение выше.

Спасибо за любую помощь по этому вопросу.

+0

Как насчет этого с ДОКЛАДОМ ПРОЦЕССА? Его легко добавить вычислительный блок для этого. – orh

+0

Ничего, я не читал это довольно четко. Я думаю, что для этого вам нужно будет использовать proc tabulate для создания выходного набора данных, провести там сравнение (сделав какую-то переменную флага на том, что вы хотите выделить), а затем распечатать ее с помощью отчета proc и сделать свое затенение. – orh

ответ

0

Я не думаю, что вы можете сделать все это в одном проке, но, конечно, вы можете сделать часть 2, если я правильно понимаю. Это называется «Traffic Lighting» в более общем плане, чтобы помочь с поиском в Google для получения более подробной информации; например, 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 Tabulate:

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

Это нужно основываться на текущей ячейке; вы не можете рассчитывать на основе другой ячейки, не используя PROC REPORT.

Смежные вопросы