2016-12-15 2 views
0

У меня есть таблица с 50 рядами. Я хочу взять в среднем каждый столбец по всей таблице, последние 40 строк и последние 30 строк. Строки имеют идентификатор даты, который идет в порядке убывания от самого старого к самому новому внизу.Как использовать proc для средних только последних n строк таблицы?

Кто-нибудь знает, как это сделать с помощью proc mean или proc sql?

ответ

1

Вы можете создать группы анализа, используя представление шага данных и параметр набора данных firstobs.

data analysis; 
    set sashelp.class(in=in1) sashelp.class(in=in2 firstobs=6) sashelp.class(in=in3 firstobs=12); 
    select; 
     when(in1) group=1; 
     when(in2) group=2; 
     when(in3) group=3; 
     end; 
    run; 
proc means; 
    class group; 
    run; 
0

Рассмотрим proc sql с производной таблицей, которая работает с коррелированным подзапросом счетчика, используемым в условном среднем вычислении внешнего запроса. Ниже приведено три числовые столбцы. Расширьте ее до фактического набора данных:

proc sql; 
    CREATE NewDataSet AS 

    (SELECT Avg(main.NumCol1) As FullAvgNumCol1, Avg(main.NumCol2) As FullAvgNumCol2, 
      Avg(main.NumCol3) As FullAvgNumCol3, 

      Avg(CASE WHEN main.RowCount <= 40 
       THEN main.NumCol1 ELSE NULL END) AS Top40AvgNumCol1, 
      Avg(CASE WHEN main.RowCount <= 40 
       THEN main.NumCol2 ELSE NULL END) AS Top40AvgNumCol2, 
      Avg(CASE WHEN main.RowCount <= 40 
       THEN main.NumCol3 ELSE NULL END) AS Top40AvgNumCol3, 

      Avg(CASE WHEN main.RowCount >= main.FullCount - 30 
       THEN main.NumCol1 ELSE NULL END) AS Bottom30AvgNumCol1, 
      Avg(CASE WHEN main.RowCount >= main.FullCount - 30 
       THEN main.NumCol2 ELSE NULL END) AS Bottom30AvgNumCol2, 
      Avg(CASE WHEN main.RowCount >= main.FullCount - 30 
       THEN main.NumCol3 ELSE NULL END) AS Bottom30AvgNumCol3 

    FROM 
     (SELECT sub.NumCol1, sub.NumCol2, sub.NumCol3, 
       (SELECT Count(*) FROM DataSet sub 
       WHERE sub.Date <= d.Date) As RowCount, 
       (SELECT Count(*) FROM DataSet) As FullCount 
     FROM DataSet d) AS main); 
quit; 
0

Это, мы надеемся, простая альтернатива. По мере того, как ваши данные уже заказываются, вы можете создать счетчик даты, который учитывает последний день, а затем использовать оператор where в вашем proc.

Создайте игрушечные данные - случайные даты и 3 числовые столбцы.

data one; 

    do i = 1 to 50; 

    date = 20000+i; 
    num1 = rand("Poisson", 6); 
    num2 = rand("uniform"); 
    num3 = i*(i-1); 
    output; 

    end; 

    format date date9.; 
    drop i; 
run; 

Создать счетчик, на который ссылаются средства proc. последний день, имеет значение 1, то самый старый день имеет значение, 50.

data two; 
set one nobs= nobs; 

    datecount = nobs - _N_ + 1; 

run; 

Использование где оператор в прок означает - datecount = < 30 говорит, что вы хотите 30 последних дней.

proc means data = two (where = (datecount =< 30)); 
    var num1 num2 num3; 
    output out = averages (drop = _type_ _freq_) 
    mean = Mean1 Mean2 Mean3; 
run; 
Смежные вопросы