Создать переменную с нечетными и четными метками - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть переменная num со значениями 1-10.

Я хотел бы создать новую переменную type со значениями odd или even:

gen type = odd if inlist(num, 1,3,5,7,9)

Вопросы:

  1. Какой самый простой способ пометить четные числа?

  2. Можно ли где-нибудь использовать отрицание и оставить команду в одной строке?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Когда ваша команда была выполнена, значение типа для нечетных чисел равно "нечетному", а значение для четных чисел - "", то есть пропущенная строка.Вы можете пометить четные числа, используя

replace type = "even" if type==""

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

Если бы вы могли использовать числовую переменную (я называю ее флагом) в качестве переменной типа, вы можете попробовать это:

gen flag = mod(num,2)

Это пометит нечетные числа как 1 и четные числакак 0. Затем можно создать метку для переменной-флага, если вам нужно отобразить ее значения как «нечетные» и «четные».

0 голосов
/ 22 сентября 2018

Код, который вы вводите, не является допустимым синтаксисом:

clear
set obs 10
generate num = _n

generate type = odd if inlist(num, 1,3,5,7,9)
odd not found
r(111);

Вы можете получить то, что вы хотите:

generate type = "odd" if inlist(num, 1,3,5,7,9)

И вы можете сделать оба одновременно, используя cond() function:

generate type = cond(inlist(num, 1,3,5,7,9), "odd", "even")

Однако наличие этой переменной в виде string будет иметь ограниченное значение для последующего использования.

Впоследствии вы можете использовать encodeкоманда для создания новой переменной числового типа:

encode type, generate(type2)

list

     +--------------------+
     | num   type   type2 |
     |--------------------|
  1. |   1    odd     odd |
  2. |   2   even    even |
  3. |   3    odd     odd |
  4. |   4   even    even |
  5. |   5    odd     odd |
     |--------------------|
  6. |   6   even    even |
  7. |   7    odd     odd |
  8. |   8   even    even |
  9. |   9    odd     odd |
 10. |  10   even    even |
     +--------------------+

Хотя переменные type и type2 кажутся идентичными, они действительно имеют другой тип:

list, nolabel

     +--------------------+
     | num   type   type2 |
     |--------------------|
  1. |   1    odd       2 |
  2. |   2   even       1 |
  3. |   3    odd       2 |
  4. |   4   even       1 |
  5. |   5    odd       2 |
     |--------------------|
  6. |   6   even       1 |
  7. |   7    odd       2 |
  8. |   8   even       1 |
  9. |   9    odd       2 |
 10. |  10   even       1 |
     +--------------------+

Вот как вы можете сделать это с type, являющимся числовой переменной:

generate type = mod(num, 2)

list

     +------------+
     | num   type |
     |------------|
  1. |   1      1 |
  2. |   2      0 |
  3. |   3      1 |
  4. |   4      0 |
  5. |   5      1 |
     |------------|
  6. |   6      0 |
  7. |   7      1 |
  8. |   8      0 |
  9. |   9      1 |
 10. |  10      0 |
     +------------+

Затем вы создаете метку значения и присоединяете ее к переменной type:

label define numlab 0 "even" 1 "odd"
label values type numlab

list

     +------------+
     | num   type |
     |------------|
  1. |   1    odd |
  2. |   2   even |
  3. |   3    odd |
  4. |   4   even |
  5. |   5    odd |
     |------------|
  6. |   6   even |
  7. |   7    odd |
  8. |   8   even |
  9. |   9    odd |
 10. |  10   even |
     +------------+

Если вы хотите, чтобы помечались нечетные числа, вы можете просто сделать:

label define numlab 1 "odd"

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

label define numlab 0 "even", add
...