2017-02-15 1 views
0

У меня есть вопрос относительно следующей проблемы. У меня есть данные, что выглядит следующим образом:Замена отсутствующего значения без пропусков в одном наборе данных

State Total 
AZ 1000 
AZ 1000 
AZ - 
CA - 
CA 4000 

То есть, я недостающие данные для переменной «общего» для некоторых наблюдений. Я хотел бы заменить недостающие значения на общую сумму из не пропущенных наблюдений.

Желаемая выход

enter code here 
State Total 
AZ 1000 
AZ 1000 
AZ **1000** 
CA **4000** 
CA 4000 

Любые идеи?

ответ

1

Если ваши значения являются постоянными, используйте PROC STANDARDIZE для замены отсутствующих значений.

Proc stdize data=have out=want missing=mean reponly; 
By state; 
Var amount; 
Run; 
+0

Небольшое примечание: как замена, так и повторное использование недопустимы. Бросьте замену, и это прекрасно работает. – pinegulf

+0

Спасибо, отредактирован, чтобы отразить это :) – Reeza

0

Вот решение, с которым я пришел. Конечно, есть более элегантные способы сделать это, но это проверено и работает.

Идея сортирует данные так, чтобы отсутствующие значения были после правильных. Затем зациклируйте каждое состояние. Сохраните значение «total» из первого наблюдения и примените его к любым отсутствующим ячейкам в состоянии.

data begin; 
    length state $3 total 5; 
    input state Total; 
    cards; 
    AZ 1000 @@ 
    AZ 1000 @@ 
    AZ  @@ 
    CA  @@ 
    CA 4000 @@ 
    OZ @@ 
    OZ 3000 @@ 
    OZ @@ 
    ; 
run; 

proc sort data=begin; by state descending total ; run; 

data Filled; 
    set begin; 
    by state; /*Handle each state as own subset*/ 
    retain memory; /*Keeps the 'memory' from prior observations and not from column */ 
    if first.state then memory=total; /*Save the value to temporary column*/ 
    if total=. then total=memory; /*Fill blanks*/ 

    drop memory; /*Cleanup*/ 
run; 
0

Объединить для обозначения среднего.

proc sql; 
    select a.state,coalesce(a.total,b.total) from have a left join (select distinct state,mean(total) as total from have group by state) b on a.state=b.state; 
quit; 
Смежные вопросы