2013-09-30 55 views
2

数据的解释:包含测量师ID和解答各种调查问题。如果对调查的答案之一是99或999或9999(无穷无尽),那么这是“否”的数字表示。如果对调查的答案之一是98或998或988,9988,998888等,这是数字表示“是”。大部分数据都是整数形式。塔塔:正则表达式搜索和整型变量替换

我想要替换所有以'9'开始并以'No'结尾的值为'No'的变量,以及以'9'开始并以'8结尾的所有变量'与“是”。

我目前的策略是每一个变量转换成字符串tostring _all, replace 然后遍历thorugh所有string_vars执行以下两个正则表达式:

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

有没有做到这一点更简单的方法,而不将所有值字符串?

+0

我想你会得到更好的回应,如果你解释你为什么要这样做。也许更多地解释你的数据。我假设它们都不是数值数据... –

+0

我添加了一个解释 – Parseltongue

回答

2

如果您要检查的数值变量都787-9另一种方式是

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

,其中20为上限由你所需要的时间最长的号码代替。

您可以使用findnamefindit 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.是否可以使用subinstr技术来查找以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) 

使用虚拟样本,您可以基于此来限制样本。

OR,

如果你没有在你的VAR1 0或1,可以用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

如果你的号码或者只787-9或一些与8最后,你不需要这里的正则表达式。您可以简单地计算数字的总和并检查sum(digits) % 9。如果它是0,你的答案是Yes,如果不是,你的答案是No

甚至更​​容易将检查[your number] % 2,这将永远是0与8,总是结尾的号码是1与9

在情况下,你只想做第一个和最后结尾的号码数字计数并且不能确定,它们总是9或8,你需要两个正则表达式。你的建议是好的,但你可以省略数字周围的[],因为只有一个字符的字符类相当于字符本身。所以你的正则表达式将是 ^9*$^9*8$

编辑: 由于现在已经很清楚,输入始终以9开头并且至少有两位数字,因此检查input % 10就足够了。这样只有最后一位数字会保留,您可以检查,如果这是98

+0

我不确定模数技巧将工作。我需要确保第一个数字是9,最后一个数字为8或9我大多只是想避免一切转换成字符串,如我想象这是一个缓慢的过程。 – Parseltongue

+0

我猜猜你的输入总是至少有2位数?它会始终以9开头吗? – Vince

+0

它总是以9开始。总是至少有2位数字。 – Parseltongue