String 如何将包含非数值的字符串转换为数值?

String 如何将包含非数值的字符串转换为数值?,string,converter,numeric,stata,String,Converter,Numeric,Stata,我有几个形式的变量: 1 gdppercap 2 19786,97 3 20713,737 4 20793,163 5 23070,398 6 5639,175 我将数据复制粘贴到Stata中,它认为它们是字符串。到目前为止,我已经尝试: destring gdppercap, generate(gdppercap_n) 但是得到 gdppercap contains nonnumeric characters; no generate 以及: 但是,不

我有几个形式的变量:

1    gdppercap
2    19786,97
3    20713,737
4    20793,163
5    23070,398
6    5639,175
我将数据复制粘贴到Stata中,它认为它们是字符串。到目前为止,我已经尝试:

destring gdppercap, generate(gdppercap_n)
但是得到

gdppercap contains nonnumeric characters; no generate
以及:

但是,不管前面的值是多少,都要得到一个编号为1到1055的变量

我也试过:

gen gdppercap_n = real(gdppercap)
但是你可以得到:

(1052 missing values generated)

你能帮我吗?据我所知,Stata不喜欢变量包含小数的事实。

您可以编写for循环将逗号转换为句点。我不太了解您的变量,但假设您有一个变量
gdppercap
,其中包含类似1234343的信息,您希望在执行
析构函数之前将其设置为1234.343

例如:

forvalues x = 1(1)10 {
   replace gdppercap = substr(gdppercap, 1, `x'-1) + "." + substr(gdppercap, `x'+1, .)    
   if substr(gdppercap, `x', 1) == ","
 }

如果我理解正确,字符串的解释来自一个或两个事实:

  • 变量名可能会在第一次观察中重复出现。如果是这样,那就是文本,它与数值变量不一致。根本问题可能是复制和粘贴操作复制了太多内容。通过复制和粘贴导入时,Stata通常会让您选择是否将复制内容的第一行视为变量名还是数据,并且您需要第一个选择,以便列标题成为变量名,而不是数据。最好返回并正确地进行复制和粘贴。但是,Stata可能会在电子表格中处理多个标题行。或者,使用
    导入excel
    ,而不是复制粘贴。或者,
    放入1
    删除第一个观察值,前提是它始终是多余的

  • 逗号表示小数位
    destring
    可以很容易地解决这个问题:查看帮助中的
    dpcomma
    选项。斯塔塔对分数没有异议;那将是荒谬的。问题是您需要标记逗号的使用

  • 注意

    • destring
      real()
      的包装,因此
      real()
      不是解决这个问题的方法

    • encode
      用于将真正的分类变量映射到整数,正如您所发现的,它的帮助确实解释了这一点。它不用于修复数据输入错误


    即使在需要时
    替换gdppercap=subinstr(gdppercap,“,”,“,”,1)
    也会使循环变得不必要。但它不是必需的
    destring
    有一个
    dpcomma
    选项。
    forvalues x = 1(1)10 {
       replace gdppercap = substr(gdppercap, 1, `x'-1) + "." + substr(gdppercap, `x'+1, .)    
       if substr(gdppercap, `x', 1) == ","
     }