【问题标题】:Stata - inputting data from .txt with "" and ,Stata - 从.txt输入数据,带有“”和,
【发布时间】:2013-01-31 19:38:14
【问题描述】:

我正在使用 perl 通过 .txt 抓取以下内容,最终将其引入 Stata。什么格式选项有效?我有很多这样的观察结果,所以想使用一种我可以概括的方法。

原始数据格式为:

 First Name: Allen
 Last Name: Von Schmidt
 Birth Year: 1965
 Location: District 1, Ocean City, Cape May, New Jersey, USA

 First Name: Lee Roy
 Last Name: McBride
 Birth Year: 1967
 Location: Precinct 5, District 2, Chicago, Cook, Illinois, USA

目标是在Stata中创建变量:

  First Name: Allen
  Last Name: Von Schmidt
  Birth Year: 1965
  County: Cape May
  State: New Jersey

  First Name: Allen
  Last Name: McBride
  Birth Year: 1967
  County: Cook
  State: Illinois

什么可能的 .txt 可能会导致这种情况,我将如何将其加载到 Stata 中?

此外,与这 2 个示例一样,Location 中的术语数量有所不同,但我总是希望在 USA 之前使用 2。

目前,我在 .txt 表中的每个变量周围加上“”。

 "Allen","Von Schmidt","1965","District 1, Ocean City, Cape May, New Jersey, USA"
 "Lee Roy","McBride","1967","Precinct 5, District 2, Chicago, Cook, Illinois, USA"

有没有更好的方法来格式化 .txt?我将如何在 Stata 中创建相应的变量?

感谢您的帮助!

附:我知道 stata 使用 infile 或 insheet 并且可以处理 , 或制表符来分隔变量。我不知道如何用所有这些在 perl 中刮取像 Location 这样的变量,所以我添加了“”

【问题讨论】:

    标签: stata


    【解决方案1】:

    这不是一个完整的答案,但我需要比 cmets(容易)允许的更多空间和灵活性。

    一个技巧是从最后剥离元素。最简单的方法可能是开始寻找最后一个逗号,这又是反转字符串中的第一个逗号。使用strpos(reverse(stringvar), ",")

    例如第一个逗号被strpos()这样找到

    . di strpos("abcd,efg,h", ",")
    5
    

    最后一个逗号是这样的

    . di strpos(reverse("abcd,efg,h"), ",")
    2
    

    一旦您知道最后一个逗号在哪里,您就可以剥离最后一个元素。如果最后一个逗号位于反转字符串中的 # 位置,则它位于字符串中的 -# 位置。

    . di substr("abcd,efg,h", -2, 2)
    ,h
    

    这些示例显然是单个字符串的计算器样式示例。但是对于整个字符串变量,可以类似地剥离最后一个元素。

    . gen poslastcomma = strpos(reverse(var), ",") 
    . gen var_end = substr(var, -poslastcomma, poslastcomma) 
    . gen var_begin = substr(var, 1, length(var) - poslastcomma) 
    

    一旦你习惯了这样的东西,你可以用更少的变量编写更复杂的语句,但是当你学习时,慢慢地,慢慢地一步一步地学习会更好。

    顺便说一句,一个常见的Stata学习器错误(在我看来)是假设一个字符串问题的解决方案必须需要使用正则表达式。如果你对正则表达式非常流利,自然可以用它们做一些奇妙的事情,但其他字符串函数结合起来也可以非常强大。

    在您的具体示例中,听起来好像您想忽略最后一个元素,例如“USA”,然后依次处理下一个向后工作的元素。

    Stata 中的split 也很好(我是粉丝,并且确实是它的假定作者)但是如果拆分产生不同数量的元素可能会很尴尬,这就是我进来的地方。

    【讨论】:

      【解决方案2】:

      有两种方法可以做到这一点。首先是将数据粘贴到您的 do-file 中并使用输入。假设格式相当规则,您可以使用逗号轻松地对其进行解析。请注意,我删除了逗号:

      #delimit;
      input
      str100(first_name last_name yob geo);
       "Allen" "Von Schmidt" "1965" "District 1, Ocean City, Cape May, New Jersey, USA";
      end;
      
      compress;
      destring, replace;
      
      split geo, parse(,);
      
      rename geo1 district;
      rename geo2 city;
      rename geo3 county;
      rename geo4 state;
      rename geo5 country;
      drop geo;
      

      第二种方法是直接从txt文件中插入数据,这可能更容易。这假设没有删除逗号:

       #delimit;
       insheet first_name last_name yob geo using "raw_data.txt", clear comma nonames;
      

      然后像第一个例子一样清理它。

      【讨论】:

      • 谢谢!根据更新的帖子,我对第一种方法有太多的观察。第二个方法使用第一个从压缩开始的方法?那么,“”都没有问题吗?里面的空格也不是说名字吗?
      • 从压缩开始。只要没有人命名为 Mac “The Knife” Gangsterson,它就应该起作用。内部空间还可以。
      • 谢谢!如果没问题,请跟进。我注意到位置的术语数量有所不同,但我总是希望在美国之前使用 2。这种方法是否仍然适用?
      • 我不确定我是否完全理解。你能发布一些例子吗?
      • 很公平。发布的示例有帮助吗?在原始数据中,第 2 个在 Location 开头有 1 个额外的术语。谢谢你的帮助!!
      猜你喜欢
      • 2021-05-15
      • 2021-05-15
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      相关资源
      最近更新 更多