具有多个变量的数据管理

时间:2012-10-31 15:46:26

标签: algorithm stata

目前我正面临以下问题,我正在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的出现次数N. ,B,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

我的问题是如何从这里解决这个问题?对于糟糕的头衔感到抱歉,但我无法更具体地说出来。

1 个答案:

答案 0 :(得分:1)

抱歉,我认为finally块是你想要的输出(现在我明白这是你迄今为止所取得的成就)。您可以通过两次调用reshapelong,然后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指定要重新整形的变量都以var开头。 i(n id)指定ni的每个唯一组合都是唯一的观察结果。 reshape调用为每个nid变量的每个var1 - var20组合提供了一个观察结果。所以现在有4 * 20 = 80次观测。然后,我只保留您希望与inlist()保持一致的字符串。

对于第二个reshape调用,var指定您正在重塑的值位于变量var中,并且您将使用此作为前缀。你想要每个剩余字母一行,所以我创建了一个新索引(最后没有实际意义),成为第二个i调用的reshape索引(如果我使用{{1} } - n作为独特的观察,然后我们最终回到我们开始的地方,但只有好的字符串)。 id索引仍然来自第一个j调用(变量reshape),因此_j已经知道要为每个reshape提供什么后缀。

这两个var调用产生:

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 | +-------------------------------------+ s。

的变量
reshape