Преобразование экспансивных вопросов типа «Проверьте все, что применимо» в случайный выбор меньших предметов - PullRequest
0 голосов
/ 30 апреля 2020

Я столкнулся с некоторыми трудностями при управлении диетическими данными о потреблении зерновых. Этот вопрос позволяет участникам выбрать как можно больше видов злаков (более 300 вариантов). Я хотел бы разбить это на два ответа путем случайного выбора. Структура данных создает проблемы. Ниже я опишу свою проблему…

1.) Структура данных сейчас: Респондентам разрешено выбирать все зерновые, которые они «обычно» едят. Данные выглядят так (1 заменяется кодом для зерновых)…

Cereal 1     Cereal 2     Cereal 3     Cereal 4     Cereal 5  
1             0           1            1            0

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

Choice 1              Choice 2              Choice 3              Choice 4             Choice 5              
Cereal 1              Cereal 3              Cereal 4                 .                     .

3.) Затем я бы хотел случайным образом выбрать два из них (поскольку мы не можем различить guish порядок выбора) на отображаться как данные ниже ...

Choice 1                       Choice 2
Cereal 1 (randomly selected)   Cereal 4 (Randomly selected)

Кто-нибудь имеет представление о том, как я мог бы сделать это sh? Я смотрю на свой код в течение некоторого времени и не могу понять это. Пожалуйста, дайте мне знать, если необходимы дальнейшие объяснения.

1 Ответ

0 голосов
/ 30 апреля 2020

Допущения:

  1. Переменные для зерновых имеют числовые значения c
  2. 0 отсутствует, в противном случае значения для зерновых превышают 0
  3. Для зерновых уникальный код, поэтому имена переменных не важны
  4. Каждый выбрал как минимум два злака.

    data want;
    set have;
    
    *set random seed to get the same 'random' results;
     call streaminit(999);
    
    *declare an array to simplify code;
     array cereal(*) cereal1-cereal300;
    
    *sort array so that cereals come first and 0s last;
    call sort(of cereal(*));
    
    *find the first 0;
    *this tells you how many cereals are selected;
    numCereals= whichn(0, of cereal(*)) - 1;
    
    *get a random number between those two numbers;
    rand1 = rand('integer', 1, numCereals);
    
    *ensure that your second random number isn't the same as the first random number;
    do until(rand2 ne rand1);
        rand2 = rand('integer', 1, numCereals);
    end;
    
    *get the values at those random index;
    randomCereal1 = cereal(rand1);
    randomCereal2 = cereal(rand2);
    
    run;
    

Есть непроверенные.

...