用分数对变量进行解串

时间:2018-11-22 10:56:20

标签: stata

我的数据中包含字符串变量,其中包含分数和非整数。

例如:

3 2/3 
8 1/2
 1.65
6 1/4
0.235

Stata无法使用destring命令对这些变量进行解串。

有什么办法可以将字符串变量转换为数字,以便将其用于分析?

2 个答案:

答案 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 |
     +---------------------+