#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. Привет, Ник, я очень ценю твое предложение и правку. Ваш ответ и дополнительные ресурсы полезны и информативны. Я также благодарен за то, что получил совет от такого профессионала, как вы. Большое вам спасибо!!!