Оценка переменной с помощью функции IN () - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь разрешить переменную шага данных в функции in (). У меня есть набор данных, который выглядит следующим образом:

|Run|Sample Level|Samples Tested|
| 1 |     1      |      1-5     |
| 1 |     2      |      1-5     |
...etc
| 1 |     5      |      1-5     |
---------------------------------
| 2 |     1      |      1-4     |
| 2 |     2      |      1-4     |

Испытанные образцы различаются в зависимости от пробега. Обычно единственными уровнями выборки в наборе данных являются уровни в диапазоне, указанном в «Проверенных образцах». Однако иногда это не так, и это может стать грязным. Например, последний, над которым я работал, выглядел так:

|Run|Sample Level|Samples Tested|
| 1 |      1     |2-9, 12-35, 37-40|

В этом случае я бы хотел отбросить все строки с уровнями образцов, которые не были включены в проверенные образцы, что я сделал вручную, добавив код:

Data Want;
set Have;
if sample_level not in (2:9, 12:35, 37:40) then delete;
run;

Но то, что я хочу сделать, это сделать это автоматически, посмотрев на колонку проверенных образцов. Достаточно легко превратить «-» в «:», но я застрял в том, что функция IN() распознает или разрешает переменную. Мне бы хотелось, чтобы код выглядел следующим образом: if sample_level not in(Samples_Tested) then delete;, где samples_tested был преобразован в нечто, что может обрабатывать функция IN(). Я также не против использования proc sql;, если у кого-то есть решение, которое, по его мнению, будет работать. Я знаю, что вы можете делать такие вещи, как

Proc sql; Create table want as select * from HAVE where Sample_Level in (Select Samples_Tested from Have); Quit;

Но проблема в том, что тестируемые образцы меняются в зависимости от серии, и может быть 16 различных серий. Надеюсь, я объяснил проблему достаточно ясно. Спасибо, что нашли время, чтобы прочитать это и заранее спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Предполагая, что значения SAMPLES_TESTED являются постоянными для каждого значения RUN, вы можете использовать его для генерации критериев выбора. Например, вы можете использовать шаг _null_ данных, чтобы записать оператор WHERE в файл, а затем% включить этот код в другой шаг данных.

filename code temp;
data _null_;
  file code;
  if eof then put ';';
  set have end=eof;
  by run;
  if first.run;
  if _n_=1 then put 'where ' @ ;
  else put '   or ' @ ;
  samples_tested=translate(samples_tested,':','-');
  put '(' run= 'and sample_level in (' samples_tested '))';
run;
data want;
  set have;
  %include code;
run;

Примечание: IN является оператором, а не функцией.

0 голосов
/ 07 марта 2019

Приятно видеть код SAS; -)

Это будет работать с одним диапазоном:

select * from HAVE where level in (tested);

Для нескольких диапазонов я бы использовал SUBSTRING_INDEX в MySQL или просто комбинацию SUBSTRING и INDEX длянайти следующее условие.выберите * в HAVE, где уровень в (test1) или уровень в (test2) или уровень в (test3);Когда вы заменяете test1, например, в качестве substr (test, 1, index (test, ',')

, для генерации образца я использовал следующее: создать таблицу have (выполнить int, level int, test varchar (20)); INSERT INTO имеют (прогон, уровень, тестирование) ЗНАЧЕНИЯ (1, 1, «3-5»); INSERT INTO имеют (прогон, уровень, тестирование) значения (1, 3, «3-5, 12:35»)); INSERT INTO имеют (прогон, уровень, проверено) ЗНАЧЕНИЯ (1, 20, "3-5, 12-35");

...