1

我有想要导入 Stata 的大型 .dat 文件。.dat 文件是两个长列,每次观察多行。我想从不同的行中制作变量。问题是我不能使用 lrecl(#) 因为观察的行数不同,并且有一个字符串确定一个观察何时结束而另一个观察何时开始。这是 .dat 文件的样子(我用 // 分隔行):

PATN// WKU D03321703// SRC 7// APN 5583950// PATN// WKU D03321711// SRC 7// APN 5455359// APT 4// ART 294// APD 19900627// PATN// WKU D03321912// SRC 7// APN 5455432// APT 4// ART 294// APD 19900456

每个观察都以“PATN”开头。我想告诉 infile 使用后续列​​创建变量,例如 WKU、SRC、APN 和 APT(如:infix str WKU 5-13 SRC 5 APN 5-11 APT 5),然后找到下一个“PATN”开始下一次观察。所以我不仅需要它来查找字符串“PATN”,还需要它能够离开“.”。当该观察不存在 APN 时。

4

1 回答 1

3

我把你的例子放在一个文件中。一些代码如下。要了解更多它的作用,请随意喷洒lists。

这里的哲学很简单。有时您可以尝试在数据输入中做太多事情。它可以像在数据集中读取未区分的文本一样容易,然后在 Stata 中对其进行操作。定义观察块、组合相邻线、拆分字符串和将数据集重新整形为一个整体都可能很有用。

 
使用 testtext.dat 输入 str244 文本,清除
gen long id = sum(text == "PATN")
如果 text == "PATN" 则删除
替换 text = text + " " + text[_n+1] if inlist(text, "APD", "APT", "APN", "ART", "WKU", "SRC")
如果 inlist(word(text[_n-1], 1), "APD", "APT", "APN", "ART", "WKU", "SRC")
拆分文本
删除文本
重命名(text1 text2)(什么)
重塑宽 which, i(id) j(what) 字符串
renpfix 哪个


. l

     +-------------------------------------------------- ------+
     | id APD APN APT ART SRC WKU |
     |------------------------------------------------- ------|
  1. | 1 5583950 7 D03321703 |
  2. | 2 19900627 5455359 4 294 7 D03321711 |
  3. | 3 19900456 5455432 4 294 7 D03321912 |
     +-------------------------------------------------- ------+

更新:这更简单:

 
使用 testtext.dat 中缀 str 文本 1-244,清除
gen long id = sum(text == "PATN")
如果 text == "PATN" 则删除
拆分文本
重命名(text1 text2)(什么)
删除文本
重塑宽 which, i(id) j(what) 字符串
renpfix 哪个
列表
于 2013-10-29T17:25:10.273 回答