2015-10-07 2 views
0

У меня есть набор данных с отметками времени и идентификаторами. Каждый идентификатор имеет несколько значений метки времени. Иногда время одно и то же, и в другое время они разные. Я сортирую данные по id, а затем по метке. И затем передаю его функции, если first.value. Затем я делаю proc freq, чтобы подсчитывать записи, и каждый раз, когда proc freq дает мне немного другое количество для некоторых идентификаторов. Общий общий счетчик не изменяется, но некоторые из значений сдвинуты, поэтому, например, для id подсчет равен a = 125 и id b = 130 Если я снова запустил код, значения будут id a = 126 и id b = 129. Общее количество очков остается неизменным, но значения незначительно меняются. Я сортирую по той же переменной, что и в функции first.value. Я также попробовал proc sort nodupkey и использовал equals и noequals в качестве опции. Есть ли другой способ сохранить только самую раннюю запись для каждого идентификатора? Спасибо.sas функция если first.value

proc sort data=a out=b ; 
by id time ; 
run; 

data c; 
set b; 
IF FIRST.id; 
BY id time; 
run; 
+0

Можете ли вы разместить точный код, который вы использовали? Цель состоит в том, чтобы получить один рекорд на один идентификатор? – Tom

+0

proc sort data = a out = b; по времени id; run; данные c; комплект b; IF FIRST.id; BY id time; run; – user601828

+0

Плохой стиль, чтобы иметь инструкцию IF между операторами SET и BY, но, вероятно, это не повлияет на шаг данных. Если вы видите изменения в количестве различных идентификационных значений, это должно быть вызвано изменениями входных данных. – Tom

ответ

0

Опубликованный код должен работать нормально. Но он будет иметь только 1 наблюдение за значение ID. Итак, если вы видите 129 наблюдений с ID = 'a', тогда вы сделали что-то другое, чем вы опубликовали.

Итак, давайте использовать SASHELP.CLASS в качестве примера набора данных, доступного для всех пользователей SAS. Мы будем рассматривать AGE как переменную id и NAME как переменную порядка в id. Таким образом, эти два шага создадут таблицу с первым человеком в возрасте.

proc sort data=sashelp.class out=one ; 
    by age name ; 
run; 
data want ; 
set one; 
by age; 
if first.age; 
run; 

Если вы запустите PROC FREQ или PRINT, вы увидите, что есть только одна запись за значение AGE.

proc freq data=want; 
    tables age; 
run; 
proc print data=want; 
    var age name; 
run; 

Если вы получаете различные значения для целей, отличных ID и DATE переменных в выводе, то это означает, что ваш вход имеет дублированные записи с одинаковыми значениями ID и DATE. Чтобы он последовательно выбирал одно и то же значение, вы можете попробовать использовать параметр EQUALS, чтобы сохранить его в относительном порядке. Однако, если ваш вход из базы данных, возможно, он не поддержит это. Вы можете искать другие ключевые переменные для добавления в оператор BY в SORT. Вы также можете попробовать отсортировать все переменные.

proc sort data=have out=want ; 
    by id date _all_ ; 
run; 
data want; 
    set want; 
    by id; 
    if first.id; 
run; 
+0

Я думаю, что ты прав. Имеются повторяющиеся записи с одинаковыми значениями ID и Date. Я нашел другую переменную, которую я могу использовать для ID, и использовал ваш код выше и получил согласованные подсчеты ... Я побежал его пять раз, чтобы быть уверенным. Спасибо за помощь. – user601828

0

Это должно сработать, вам придется сортировать дважды.

proc sort data=a out=b; 
by id time ; 
run; 

proc sort data=b nodupkey; 
by id; 
run; 

Из документации NOEQUALS не поддерживает порядок вывода, что важно в этом случае.

EQUALS | NOEQUALS определяет порядок наблюдений в наборе выходных данных. Для наблюдений с одинаковыми значениями переменной BY EQUALS поддерживает относительный порядок наблюдений во входных данных, заданных в наборе выходных данных. NOEQUALS не обязательно сохраняет этот порядок в наборе выходных данных.

+0

Нет, он все еще не работает. Я исключил нули и пробелы и отсортировал их дважды, но подсчеты не совпадают между каждой итерацией кода. – user601828

+0

У вас есть что-то еще. Сделайте снимок ваших данных и протестируйте их или разместите свой код как минимум. – Reeza

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