Как разделить данные и распределить их по назначенным переменным?

#string #split #stata #data-cleaning

Вопрос:

У меня есть данные в Stata относительно ощущения текущей ситуации. Существует семь типов чувств. Данные хранятся в следующем формате (обратите внимание, что тип данных-строка, и один человек может ответить более чем на 1 ответ)

чувство
4,7
1,3,4
2,5,6,7
1,2,3,4,5,6,7

Поскольку данные представляют собой строку, я попытался разделить их на

 split feeling, parse (,)
 

и я получил результат

чувство1 чувство 2 чувство 3 чувство 4 чувство 5 чувство 6 чувство 7
4 7
1 3 4
2 5 6 7
1 2 3 4 5 6 7

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

чувство1 чувство 2 чувство 3 чувство 4 чувство 5 чувство 6 чувство 7
4 7
1 3 4
2 5 6 7
1 2 3 4 5 6 7

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

Ответ №1:

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

 * Example generated by -dataex-. For more info, type help dataex
clear
input str13 feeling
"4,7"          
"1,3,4"        
"2,5,6,7"      
"1,2,3,4,5,6,7"
end

forval j = 1/7 {
    gen wanted`j' = `j' if strpos(feeling, "`j'")
    gen better`j' = strpos(feeling, "`j'") > 0
}

l feeling wanted1-better3

      --------------------------------------------------------------------------- 
     |       feeling   wanted1   better1   wanted2   better2   wanted3   better3 |
     |---------------------------------------------------------------------------|
  1. |           4,7         .         0         .         0         .         0 |
  2. |         1,3,4         1         1         .         0         3         1 |
  3. |       2,5,6,7         .         0         2         1         .         0 |
  4. | 1,2,3,4,5,6,7         1         1         2         1         3         1 |
      --------------------------------------------------------------------------- 
 

Если вы хотите получить строковый результат, который будет получен

  gen wanted`j' = "`j'" if strpos(feeling, "`j'") 
 

Если бы количество чувств было 10 или более, вам потребовался бы более тщательный код, например, поиск "1" нашел бы его внутри "10" .

Индикаторные (некоторые говорят, фиктивные) переменные с различными значениями 1 или 0 являются гораздо более ценными для большинства анализов данных такого рода.

Примечание. Источники, связанные со статусом, такие как

этот часто задаваемый вопрос

этот документ

и эта бумага.

Комментарии:

1. Привет, Ник, я очень ценю твое предложение и правку. Ваш ответ и дополнительные ресурсы полезны и информативны. Я также благодарен за то, что получил совет от такого профессионала, как вы. Большое вам спасибо!!!