2013-09-30 4 views
2

Объяснение DATA: содержит идентификатор геодезиста и ответы на различные вопросы обследований. Если один из ответов на опрос составляет 99 или 999 или 9999 (до бесконечности), то это числовое представление «Нет», Если один из ответов на опрос составляет 98 или 998 или 988, 9988, 998888 и т. Д., Это числовое представление «Да». Большая часть данных находится в целочисленной форме.Stata: поиск и замена регулярных выражений по целочисленным переменным

Я хочу заменить все переменные, которые имеют значения, начинающиеся с «9» и заканчивающиеся на «9» словом «Нет», и все переменные, начинающиеся с «9» и заканчивающиеся на «8» 'с "Да".

Моя текущая стратегия заключается в преобразовании каждый переменный в строку tostring _all, replace , а затем итерация Копания всего string_vars выполнить следующие два регулярные выражения:

regexr(`value', "^[9]*[9]$","No") 
regexr(`value', "^[9]*[8]$", "Yes") 

есть более простой способ сделать это без преобразования всех значений строки?

+0

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

+0

Я добавил объяснение – Parseltongue

ответ

2

Если вы хотите проверить для числовых переменных, которые все 9s другой путь

... if subinstr(string(myvar, "%20.0f"), "9", "", .) == "" 

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

Вы можете найти все целочисленные переменные, используя findname (findit findname указывает источники загрузки).

findname, all(@==int(@)) local(intvars) 
foreach v of local intvars { 
     gen s`v' = "YES" if subinstr(string(myvar, "%20.0f"), "9", "", .) == "" 
} 

может быть частью того, что вы хотите. Есть ли ответы, кроме «ДА» и «НЕТ»?

+0

Как всегда, единственный реальный ответ Stata. Тем не менее, я надеялся, что будет решение без необходимости конвертировать ВСЕ переменные в строки, прежде чем делать это. Есть ли другой способ? Прямо сейчас, они целые. – Parseltongue

+0

В этом решении нет преобразования переменных в строки, кроме того, что вы просите, то есть вы указали, что хотите слова «Да» «Нет» и т. Д. Строковые операции в 'if subinstr()' не меняют данные , –

+0

Два вопроса, Ник: 1. Возможно, что максимальный размер целого 256, а не 20. Можно ли изменить% 20.0 на% 256.0? 2. Можно ли использовать вашу технику субинструмента, чтобы найти целые числа, начинающиеся с 9, а затем где-нибудь между 8 или 255 8. – Parseltongue

1

Для этого вы можете использовать inlist. var1 переменная, которая содержит эти числа

gen dummy="" 
replace dummy ="NO" if inlist(var1,99,999,9999) 
replace dummy ="YES" if inlist(var1,98,998,988) 

С соской в ​​руках, вы можете ограничить выборку, основанную на ней.

ИЛИ

Если вы не имеете 0 или 1 в вашем var1, вы можете заменить их 0 и 1.

replace var1 =0 if inlist(var1,99,999,9999) 
replace var1 =1 if inlist(var1,98,998,988) 
+0

Эй, Метрики, я не уверен, что это жизнеспособно. Я не знаю всех возможных конфигураций номеров, которые будут введены программой обследования. Это может быть 999999 или 9888899 и т. Д. Мне нужно убедиться, что первое число равно 9, а последнее - 9 или 8. – Parseltongue

+0

Вы имеете в виду, что каждый вопрос будет иметь разные числа, начинающиеся с 9 и заканчивающиеся на 8 ?. В вопросе вы сказали только 3. – Metrics

0

Если ваши номера либо только 9s или что-то с 8 в конце вам не нужно регулярное выражение. Вы можете просто рассчитать сумму цифр и проверить sum(digits) % 9. Если это 0, ваш ответ Yes, если это не так, ваш ответ No.

Еще проще было бы проверить [your number] % 2, который всегда будет 0 для числа, заканчивающегося с 8 и всегда быть 1 для ряда заканчивающегося 9.

В случае, если вы хотите сделать только первый и последний и не может быть уверен, что они всегда равны 9 или 8, вам понадобятся два регулярных выражения. Ваши предлагаемые являются хорошими, хотя вы можете опустить [] вокруг чисел, поскольку класс символов с одним символом эквивалентен самому символу. Таким образом, ваши регексы будут ^9*$ и ^9*8$.

Редактировать: Поскольку теперь ясно, вход всегда начинается с 9 и имеет как минимум две цифры, этого было бы достаточно, чтобы проверить input % 10. Таким образом, останется только последняя цифра, и вы можете проверить, если это 9 или 8.

+0

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

+0

Я правильно догадываюсь, что ваш вход всегда не менее 2 цифр? Будет ли он всегда начинаться с 9? – Vince

+0

Он всегда начинается с 9. Как минимум 2 цифры всегда. – Parseltongue

Смежные вопросы