как решить проблему выбора нескольких строк - PullRequest
0 голосов
/ 28 июля 2011

У меня есть данные в этом формате - это просто

пример: n = 2

X      Y      info

2      1       good
2      4       bad

3      2      good

4     1       bad
4      4      good

6       2     good
6       3     good

Теперь вышеприведенные данные отсортированы (всего 7 строк). Мне нужно составить группу из 2, 3 или 4 строк отдельно и сгенерировать график. В приведенных выше данных я сделал группу из 2 строк. Третий ряд остается один, поскольку в третьем ряду нет другого столбца для формирования группы. Группа может быть сформирована только в пределах одного ряда. НЕ с другими рядами.

Теперь я проверю, имеют ли обе строки «хорошо» в информационном столбце или нет. Если в обеих строках есть «хорошо» - сформированная группа тоже хорошая, в противном случае плохая. В приведенном выше примере третья / последняя группа является «хорошей» группой. Остальные все плохие группы. Как только я закончу со всеми строками, я вычислю общее число. Добрых групп сформировано / Всего нет. групп.

В приведенном выше примере вывод будет: Всего нет. хороших групп / Всего нет. групп => 1 / 3.

Это случай n = 2 (размер группы)

Теперь, для n = 3, мы делаем группу из 3 строк, а для n = 4 мы делаем группу из 4 строк и аналогичным образом находим хорошие / плохие группы. Если все строки в группе имеют «хороший» блок - результатом будет хороший блок, в противном случае - плохой.

Пример: n = 3

2      1       good
2      4       bad
2     6        good

3      2      good

4     1       good
4      4      good
4    6        good

6       2     good
6       3     good

В вышеприведенном случае я оставил 4-ю строку и последние 2 строки, так как не могу создать из них группу из 3 строк. Результат первой группы - «плохо», а результат последней группы - «хорошо».
Выход: 1/2

Для n = 4:

2      1       good
2      4       good
2      6        good
2      7       good

3      2      good

4     1       good
4      4      good
4    6        good

6       2     good
6       3     good
6       4     good
6       5     good

В этом случае я делаю группу из 4 и нахожу результат. 5-й, 6-й, 7-й, 8-й ряд остаются позади или игнорируются. Я сделал 2 группы из 4 рядов, и обе - «хорошие» блоки. Выход: 2/2

Итак, после получения 3 выходных значений для n = 2, n-3 и n = 4 я построю график этих значений.

1 Ответ

1 голос
/ 09 августа 2011

Ниже приведен код, который, я думаю, получает то, что вы ищете. Предполагается, что данные, которые вы описали, хранятся отдельно в трех наборах данных с именами data_2, data_3 и data_4. Каждый из этих наборов данных обрабатывается макросом% FIND_GOOD_GROUPS, который определяет, какие группы X имеют все «ХОРОШИЕ» значения в INFO, затем эта сводная информация добавляется в виде новой строки в набор данных BASE. Я не добавил код, но вы можете рассчитать отношение GOOD_COUNT к FREQ на отдельном шаге данных, а затем использовать процедуру для построения графика для значения N и отношения. Надеюсь, это приблизится к тому, что вы пытаетесь достичь.


%******************************************************************************;
%macro main;

   %find_good_groups(dsn=data_2, n=2);
   %find_good_groups(dsn=data_3, n=3);
   %find_good_groups(dsn=data_4, n=4);

   proc print data=base uniform noobs;

%mend main;
%******************************************************************************;
%******************************************************************************;
%macro find_good_groups(dsn=,n=);

   %***************************************************************************;
   %* Sort data by X and Y so that you can use FIRST.X variable in Data step. *;
   %***************************************************************************;
   proc sort data=&dsn;
      by x y;
   run;

   %***************************************************************************;
   %* TEMP dataset uses the FIRST.X variable to reset COUNT and GOOD_COUNT to *;
   %* initial values for each row where X changes. Each row in the X groups   *;
   %* adds 1 to COUNT and sets GOOD_COUNT to 0 (zero) if INFO is ever "BAD".  *;
   %* A record is output if COUNT is equal to the macro parameter &N.         *;
   %***************************************************************************;
   data temp;
      keep good_count n;
      retain count 0 good_count 1 n &n;
      set &dsn;
      by x y;
      if first.x then do;
         count = 0;
         good_count = 1;
      end;
      count = count + 1;
      if good_count eq 1 then do;
         if trim(left(upcase(info))) eq "BAD" then do;
            good_count = 0;
         end;
      end;
      if count eq &n then output;
   run;

   %***************************************************************************;
   %* Summarize the TEMP data to find the number of times that all of the     *;
   %* rows had "GOOD" in the INFO column for each value of X.                 *;
   %***************************************************************************;
   proc summary data=temp;
      id n;
      var good_count;
      output out=n_&n (drop=_type_) sum=;
   run;

   %***************************************************************************;
   %* Append to BASE dataset to retain the sums and frequencies from all of   *;
   %* the datasets. BASE can be used to plot the N / number of Good records.  *;
   %***************************************************************************;
   proc append data=n_&n base=base force; run;

%mend find_good_groups;
%******************************************************************************;
%main
...