【问题标题】:Stata infile using .dat file with multiple line obs of varying #s of lines separated by stringStata infile 使用 .dat 文件,其中多行 obs 由字符串分隔的不同行数
【发布时间】:2023-12-09 19:47:01
【问题描述】:

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

PATN// WKU D03321703// SRC 7// APN 5583950// 专利号// WKU D03321711// SRC 7// APN 5455359// APT 4// 艺术 294// APD 19900627// 专利号// WKU D03321912// SRC 7// APN 5455432// APT 4// 艺术 294// APD 19900456

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

【问题讨论】:

  • 你对数据的描述让我有点困惑。原始数据实际上是什么样的?它是否有 // 在其中,或者这些记录实际上在不同的行上?

标签: text stata infix-notation file-io


【解决方案1】:

我把你的例子放在一个文件里。一些代码如下。要了解更多它的作用,请随意使用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 哪个 列表

【讨论】:

    最近更新 更多