SAS выводит результаты во входной набор данных (одно и то же имя входящего и исходящего набора данных)

Я не смог найти информацию об этой проблеме или не смог правильно задать вопрос.

Позвольте задать вопрос с кодом:
Это операция

data work.tmp;
    set work.tmp;
    * some changes to data here;
run;

или особенно

proc sort data = work.tmp out = work.tmp;
    by x;
run;

опасно в любом случае или считается плохой практикой в ​​SAS? Обратите внимание на одинаковые имена входных и выходных наборов данных, что и является моей основной мыслью. Правильно ли SAS обрабатывает эту ситуацию, чтобы не было неоднозначных результатов при выполнении такого рода шага / процедуры данных?


person Matek    schedule 17.08.2015    source источник


Ответы (2)


Последнее, само по себе, выполняется довольно часто; поскольку сортировка просто переупорядочивает набор данных, и (если вы не зависите от другого порядка или если вы не используете предложение where для фильтрации набора данных или параметров переименования / сохранения / удаления) не наносит постоянного вреда для набор данных, это не считается плохой практикой, пока tmp находится в работе (или имя библиотеки, предназначенное для использования в качестве рабочего каталога). SAS создает временный файл для сортировки, и в случае успеха удаляет старый и переименовывает временный файл; нет существенного риска коррупции.

Первое, установка набора данных для самого себя на этапе данных, обычно не считается хорошей практикой. Это потому, что шаг данных часто делает что-то необратимое - например, если вы запускаете его один раз, он дает другой результат, чем если вы запускаете его снова. Таким образом, вы рискуете не знать, какой статус имеет ваш набор данных; и в то время как с sort вы можете положиться на знание, потому что вы получаете очевидную ошибку, если она не отсортирована должным образом большую часть времени, с шагом данных, о котором вы, возможно, никогда не узнаете. Таким образом, каждый шаг данных обычно должен создавать новый набор данных (по крайней мере, новый для этого потока). Бывают случаи, когда это необходимо или, по крайней мере, было бы существенно расточительно не делать этого - возможно, макрос, который иногда выполняет длинный шаг данных, а иногда нет, - но обычно вы можете программировать вокруг этого.

Однако это не опасно в том смысле, что может запутаться файловая система; аналогично sort, SAS просто создаст временный файл, заполнит новый набор данных, затем удалит старый и переименует временный файл.

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

person Joe    schedule 17.08.2015
comment
Если позволяет пространство, генерируемые наборы данных могут быть полезны там, где наборы данных перезаписываются. Вероятно, также стоит упомянуть НЕ помещать предложение where в proc sort, если новый набор данных не указан (если вы определенно не хотите сортировать и удалять строки одновременно!) - person Longfish; 17.08.2015
comment
Я не считаю генерацию наборов данных полезным решением вышеперечисленного; проблема, с которой я сталкиваюсь с повторным использованием имен наборов данных, в основном не в знании того, есть ли у вас набор данных до или после. Поколение на самом деле не помогло бы (сильно). - person Joe; 17.08.2015
comment
Спасибо за очень хороший ответ, Джо. Могу я спросить, пока набор данных находится в рабочем каталоге? Разве SAS не создаст набор данных tmp, а затем переименует его (как вы сказали) в нерабочий каталог? Может ли быть вредным выполнение подобных операций на неработающем? - person Matek; 17.08.2015
comment
@Matek О, нет, в любом случае это будет работать так - WORK не имеет особого значения, кроме автоматической очистки и значения по умолчанию, когда не указано имя библиотеки. Но я обычно не сортирую имя библиотеки в постоянном месте, поскольку в этом нет необходимости: либо отсортируйте его перед тем, как выложить (например, вы можете указать out=perm.dsname), либо, если вы его используете, отсортируйте его входящие • После выпуска постоянного набора данных его следует оставить в покое, чтобы другие пользователи могли ожидать, что он будет согласованным, и не изменит порядок сортировки только потому, что вы хотели его в другом порядке. - person Joe; 17.08.2015
comment
Понятно :) Спасибо за эти дидактические пояснения. - person Matek; 18.08.2015

Некоторые примеры того, почему это не считается хорошей практикой. Предположим, вы работаете в интерактивном режиме и у вас есть следующий набор данных кода с именем tmp:

data tmp;
  set sashelp.class;
run;

Если бы вы дважды запускали приведенный ниже код, в первый раз он работал бы нормально, но при втором запуске вы получите предупреждение, так как возраст переменной больше не существует в этом наборе данных:

data tmp;
  set tmp;
  drop age;
run;

В данном случае это довольно безобидный пример, и вам повезло, что SAS просто выдает предупреждение. Однако в зависимости от того, что делал шаг данных, это могло так же легко быть чем-то, что генерировало ошибку, например:

data tmp;
  set tmp (rename=(age=blah));
run;

Или, что еще хуже, он может не генерировать ОШИБКУ или ПРЕДУПРЕЖДЕНИЕ и изменить ожидаемые результаты, как в приведенном ниже коде:

data tmp;
  set tmp;
  weight = log(weight);
run;

Мы намерены применить простое преобразование журнала к переменной веса при подготовке к моделированию, но если мы случайно запустим этот шаг во второй раз, мы вычислим журнал (log (вес)). Никаких предупреждений или ошибок не будет, и, глядя на набор данных, не сразу станет очевидно, что что-то не так.

ИМО, вам намного лучше создавать итеративные наборы данных, т.е. tmp1, tmp2, tmp3 и так далее ... для каждого процесса, который каким-либо образом обновляет набор данных. Место намного дешевле, чем тратить время на отладку.

person Robert Penridge    schedule 17.08.2015