我的数据中包含字符串变量,其中包含分数和非整数。
例如:
3 2/3
8 1/2
1.65
6 1/4
0.235
Stata无法使用destring
命令对这些变量进行解串。
有什么办法可以将字符串变量转换为数字,以便将其用于分析?
答案 0 :(得分:2)
下面的代码在扩展到“ 3 2/3”或“-6 1/4”(注意空格)的情况下,对于保存某些类型的输入也可能很有用。
replace var1 = subinstr(var1, "- ", "-",.)
split var1, generate(x) destring force
egen y = ends(var1) if strmatch(var1,"*/*"), last
split y, destring force p("/")
replace x1 = cond(x1<0, x1-y1/y2, cond(x1!=.,x1+y1/y2, y1/y2)) if y1!=.
keep var1 x1
答案 1 :(得分:1)
如果字符串变量中的所有值看起来都与示例中的相同,则可以执行以下操作:
clear
input str6 var1
"3 2/3"
"8 1/2"
"6/8"
"-2/3"
"1.65"
"-6 1/4"
"-0.235"
end
replace var1 = subinstr(var1," ",":", .)
replace var1 = "0:" + var1 if !strmatch(var1, "*:*") & !strmatch(var1, "-*") & strmatch(var1, "*/*")
replace var1 = "-0:" + substr(var1, 2, .) if !strmatch(var1, "*:*") & strmatch(var1, "-*") & strmatch(var1, "*/*")
replace var1 = subinstr(var1,":"," ", .)
generate double var2 = real(var1) if !strmatch(var1, "*/*")
replace var2 = real(substr(var1, 1, strpos(var1, " ") - 1)) + ///
( real(substr(var1, strpos(var1, " "), strpos(var1, "/") - strpos(var1, " "))) / ///
real(substr(var1, strpos(var1, "/") + 1, .)) ) ///
if strmatch(var1, "*/*") & !strmatch(var1, "-*")
replace var2 = - ( abs(real(substr(var1, 1, strpos(var1, " ") - 1))) + ///
( real(substr(var1, strpos(var1, " "), strpos(var1, "/") - strpos(var1, " "))) / ///
real(substr(var1, strpos(var1, "/") + 1, .)) ) ) ///
if strmatch(var1, "*/*") & strmatch(var1, "-*")
有关使用每个功能的更多信息,请键入help
,然后键入其
名称:real()
,strmatch()
,substr()
,subinstr()
,strpos()
,abs()
。
编辑:
上述方法依赖于使用Stata字符串函数的字符串操作,因此比其他答案中提供的解决方案更长。
尽管如此,您可以如下缩短代码并提高可读性:
local m1 !strmatch(var1, "* *")
local m2 strmatch(var1, "-*") & strmatch(var1, "*/*")
replace var1 = cond(`m1' & !`m2', "0 " + var1, ///
cond(`m1' & `m2', "-0 " + substr(var1, 2, .), var1 + "" ) )
local e1 real(substr(var1, 1, strpos(var1, " ") - 1))
local e2 (real(substr(var1, strpos(var1, " "), strpos(var1, "/") - strpos(var1, " "))) / ///
real(substr(var1, strpos(var1, "/") + 1, .)) )
generate var2 = cond(!strmatch(var1, "*/*"), real(var1), ///
cond(!`m2', `e1' + `e2', - ( abs(`e1') + `e2' ) ) )
在两种情况下,您都会得到:
list, separator(0)
+---------------------+
| var1 var2 |
|---------------------|
1. | 3 2/3 3.6666667 |
2. | 8 1/2 8.5 |
3. | 0 6/8 .75 |
4. | -0 2/3 -.66666667 |
5. | 1.65 1.65 |
6. | -6 1/4 -6.25 |
7. | -0.235 -.235 |
+---------------------+