目前我正面临以下问题,我正在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
我的问题是如何从这里解决这个问题?对于糟糕的头衔感到抱歉,但我无法更具体地说出来。
答案 0 :(得分:1)
抱歉,我认为finally块是你想要的输出(现在我明白这是你迄今为止所取得的成就)。您可以通过两次调用reshape
(long
,然后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)
指定n
和i
的每个唯一组合都是唯一的观察结果。 reshape
调用为每个n
到id
变量的每个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