2

目前我面临以下问题,我正在 Stata 解决这个问题。我添加了算法标签,因为它主要是我感兴趣的步骤而不是 Stata 代码。

我有一些变量,比如 var1 - var20 可能包含一个字符串。我只对其中一些字符串感兴趣,我们称它们为 A、B、C、D、E、F,但也可以出现其他字符串(所有这些都将表示为 X)。我还有一个唯一的标识符 ID。部分数据可能如下所示:

ID  |  var1  |  var2  |  var3  |  ..  |  var20  
1   |   E    |        |        |      |    X
1   |        |   A    |        |      |    C
2   |   X    |   F    |   A    |      |   
8   |        |        |        |      |    E

现在我想为每个 ID 以及在任何变量中每次出现的字符串 A、B、C、E、D、F 之一创建一个条目。上面的数据应该是这样的:

ID  |  var1  |  var2  |  var3  |  ..  |  var20
1   |    E   |        |        |  ..  |       
1   |        |    A   |        |      |       
1   |        |        |        |      |    C
2   |        |    F   |        |      |
2   |        |        |    A   |      |
8   |        |        |        |      |    E

在这里,每当有一个不是 A、B、C、D、E 或 F 的字符串 X 时,我们都会忽略。到目前为止,我的尝试是创建一个变量,为每个条目计算 A、B 出现的次数 N, C、D、E、F。在上面的原始数据中,该变量将为 N=1,2,2,1。然后对于每个条目,我都会创建 N 个副本。这导致数据:

ID  |  var1  |  var2  |  var3  |  ..  |  var20  
1   |   E    |        |        |      |    X
1   |        |   A    |        |      |    C
1   |        |   A    |        |      |    C
2   |   X    |   F    |   A    |      |   
2   |   X    |   F    |   A    |      |   
8   |        |        |        |      |    E

我的问题是如何从这里解决这个问题?很抱歉标题不好,但我无法更具体地表达它。

4

1 回答 1

1

抱歉,我认为 finally 块是您想要的输出(现在我知道这是您到目前为止所完成的)。您可以通过两次调用reshape( long, then wide) 来获得中间块。

首先,我将生成与您匹配的数据。

clear
set obs 4

* ids
generate n = _n
generate id = 1 in 1/2
replace id = 2 in 3
replace id = 8 in 4

* generate your variables
forvalues i = 1/20 {
    generate var`i' = ""
}
replace var1 = "E" in 1
replace var1 = "X" in 3
replace var2 = "A" in 2
replace var2 = "F" in 3
replace var3 = "A" in 3
replace var20 = "X" in 1
replace var20 = "C" in 2
replace var20 = "E" in 4

现在这两个调用reshape.

* reshape to long, keep only desired obs, then reshape to wide
reshape long var, i(n id) string   
keep if inlist(var, "A", "B", "C", "D", "E", "F")
tempvar long_id
generate int `long_id' = _n
reshape wide var, i(`long_id') string

第一个reshape将您的数据从宽转换为长。var指定要重塑为 long 的变量都以var. i(n id)指定 和 的每个唯一组合n是唯一i的观察。该调用为每个通过变量reshape提供了一个观察n-id组合。所以现在有 4*20=80 个观察值。然后我只保留你想保留的字符串。var1var20inlist()

对于第二个reshape调用var,指定您正在重塑的值在变量中var,并且您将使用它作为前缀。您希望每个剩余字母有一行,所以我创建了一个新索引(最终没有真正意义),它成为第二次调用的i索引(如果我使用-作为唯一观察,那么我们最终会回到哪里我们开始了,但只有好的琴弦)。索引从第一次调用(变量)开始保留,因此已经知道给每个 赋予什么后缀。reshapenidjreshape_jreshapevar

这两个reshape调用产生:

. list n id var1 var2 var3 var20

     +-------------------------------------+
     | n   id   var1   var2   var3   var20 |
     |-------------------------------------|
  1. | 1    1      E                       |
  2. | 2    1             A                |
  3. | 2    1                            C |
  4. | 3    2             F                |
  5. | 3    2                    A         |
     |-------------------------------------|
  6. | 4    8                            E |
     +-------------------------------------+

您可以轻松地添加回不存在两个reshapes 的变量。

* if you need to add back dropped variables
forvalues i =1/20 {
    capture confirm variable var`i'
    if _rc {
        generate var`i' = ""
    }
}
于 2012-10-31T19:30:01.553 回答