Ведение наблюдений при выполнении определенных требований - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь очистить свои данные некоторых наблюдений. Я только хочу сохранить строки, в которых одна из моих 10 переменных, по крайней мере, в одном месте, содержит определенное значение (код). Набор данных очень большой и может содержать огромное количество значений для переменных. Я мог бы только хотеть держать строки, где есть наблюдения, начинающиеся с 'C'. Они могут быть закодированы как что-нибудь между C000 до CA798 и так далее. Я также хочу сохранить строку, если где-то есть другое наблюдение, но на этот раз это могут быть UG63000 до UG68999 и UG74. Один из требуемых кодов должен появляться только один раз в строке, но если где-то в строке есть несколько требуемых кодов, это не проблема. Позже я хочу закодировать их так, чтобы там, где когда-либо существовало одно из интересующих меня значений, я получал 1.

Таким образом, проблема заключается в обобщении условия удаления / сохранения для кодов с определенными значениями без необходимости жесткого кодирования каждого из возможных значений, таких как: сохранить, если переменная1 = C000 или если переменная1 = C0001, или если переменная2 = C000, или если переменная2 = UG63 и т. д.

Строка может выглядеть так:

ID Var1 Var2 ... Var10

Xyz C700 TI0213 ... Z892DA

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

(Пожалуйста, предоставьте пример данных, чтобы мы могли проверить вашу ситуацию.)

Вопрос немного неясен, поэтому я предоставлю несколько возможностей.

переменная1 = С000, или если переменная1 = С0001, или если переменная2 = С000

если вы просто хотите проверить, начинается ли переменная1 с 'C', то вы уже можете упростить эти 3 условия с помощью 1:

variable1 =: 'C'

UG63000 - UG68999 и UG74

Какое здесь правило? Если правило «начинается с« UG », то

variable2 =: 'UG'

Если правило находится в предопределенном списке, вы можете использовать что-то вроде этого:

variable2 in ('UG63000','UG68999','UG74')

Или вы можете обобщить больше с помощью макросов.

0 голосов
/ 03 апреля 2019

Возможно, вы захотите получить ваши данные в более нормализованном формате, чтобы у вас была только одна переменная с кодом. Затем вы можете объединить таблицу поиска для классификации кодов.

Чтобы упростить генерацию кода, вы можете создать макрос. Что-то вроде:

%macro condition(varlist,valuelist);
%local i j sep;
(
%do i=1 %to %sysfunc(countw(&varlist));
%do j=1 %to %sysfunc(countw(&valuelist));
 &sep %scan(&varlist,&i) = %upcase("%scan(&valuelist,&j)")
%let sep=or;
%end;
%end;
)
%mend condition;

Затем вы можете использовать его в выражении WHERE. Или создать новую переменную 0/1.

%let varlist=var1 var2 var3 ;
data want;
  set have;
  where %condition(&varlist,C0001 C0002);
  diseaseA = %condition(&varlist,D0001 D0002);
end;
...