DATA说明:包含测量员ID和各种调查问题的答案。如果调查的答案之一是99或999或9999(无限期),那么这是“否”的数字表示。如果调查的答案之一是98或998或988,9988,998888等,那么这是“是”的数字表示。大多数数据是整数形式。
我想替换所有变量,这些变量的值以'9'开头,以'9'结尾,单词为“No”,所有变量以'9'开头,以'8'结尾“是的。”
我目前的策略是将每个变量转换为字符串tostring _all, replace
然后迭代所有string_vars
执行以下两个正则表达式:
regexr(`value', "^[9]*[9]$","No")
regexr(`value', "^[9]*[8]$", "Yes")
是否有更简单的方法可以在不将所有值转换为字符串的情况下执行此操作?
答案 0 :(得分:2)
如果要检查全部为9的数字变量是另一种方式
... 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", "", .) == ""
}
可能是您想要的一部分。除“是”和“否”之外是否有答案?
答案 1 :(得分: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)
答案 2 :(得分:0)
如果你的数字只是9s或者最后是8,那么你不需要这里的正则表达式。您可以简单地计算数字的总和并检查sum(digits) % 9
。如果为0,则答案为Yes
,如果不是,则答案为No
。
更容易检查[your number] % 2
,对于以8结尾的数字,总是0,对于以9结尾的数字,总是1。
如果你想只计算第一个和最后一个数字并且无法确定,它们总是9或8,你需要两个正则数。你提议的那些很好,虽然你可以省略数字周围的[]
,因为只有一个char的字符类等同于char本身。所以你的正则表达将是
^9*$
和^9*8$
。
编辑:
由于现在已经清楚了,输入将始终以9
开头,并且至少有两位数,只需检查input % 10
即可。这样,只有最后一位数字会保留,您可以检查,如果是9
或8
。