2014-10-15 4 views
1

У меня есть большой набор данных, в котором есть все штаты, в настоящее время смотрящие на NE. Я смотрю на каждое состояние отдельно, и я хочу подсчитать количество строк, которые включены в каждое состояние. В настоящее время я использую:SAS simple row count

record_num = _N_; 

НО Это дает мне количество строк первой строки, в которую включен NE. Пример, строка 49752 является первым record_num:

49752 
49753 
49754 
49756 
49757 
49758 

Я хочу:

1 
2 
3 
4 
5 
6 

Я хочу, чтобы это было равно 1 вместо этого. Я мог бы сделать:

record_num=_N_; 
num = record_num-49751; 

Но я не хочу, чтобы изменить этот код каждый раз, когда я изменить состояние, которое изменило бы record_num.

+1

http://www.ats.ucla.edu/ stat/sas/faq/enumerate.htm Учебники SAS UCLA - очень полезные ссылки в целом. – Reeza

ответ

1

Обработка по группам SAS - это то, что вам нужно использовать.

Например:

data want; 
    set have; 
    by state; 
    if first.state then counter=0; 
    counter+1; 
run; 

Что это делает, когда изменения ГОСУДАРСТВЕННЫХ, последняя запись перед изменением имеет переменную LAST.STATE значения 1 (в противном случае имеет значение 0), а также следующую запись (первое для новое значение состояния) имеет переменную FIRST.STATE, установленную в 1 (иначе 0).

Таким образом, мы устанавливаем счетчик 0 каждый раз, когда встречается новое состояние, и увеличиваем его (var+1; увеличивает эту переменную и сохраняет ее по строкам).

Если вы хотите иметь только фактический счет, так как примечания вася в комментариях, то добавьте if last.state; перед запуском (который даст вам только одну строку для каждого состояния, последний).

+0

Я бы добавил 'if last.state then output;' before' run; ' – vasja

+0

@vasja Хорошая точка. – Joe

2

Некоторые альтернативы ответам Джо. Вы можете использовать proc means для вычисления количества строк для каждого состояния. В качестве примера я использовал набор данных sashelp.zipcode. Опция nway сообщает, что она суммирует все переменные в операторе class. Опция n= в операторе вывода говорит ему просто вычислить количество наблюдений для переменных класса (вы также можете выбрать другие агрегированные функции, такие как среднее, сумма и т. Д.).

proc means data=sashelp.zipcode nway missing noprint; 
    class statecode; 
    output out=want(keep=statecode _freq_) n=; 
quit; 

Там также SQL подход, который является моим любимым, как это широко известно, синтаксис, который может быть использован на нескольких языках программирования:

proc sql noprint; 
    create table want as 
    select statecode, 
     count(*) as num_records 
    from sashelp.zipcode 
    group by 1 
    order by 1 
    ; 
quit;