gpt4 book ai didi

algorithm - 具有多个变量的数据管理

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:02:14 24 4
gpt4 key购买 nike

目前我正面临以下问题,我正在 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

我的问题是如何从这里解决这个问题?很抱歉标题不好,但我不能说得更具体了。

最佳答案

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

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

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) 指定 ni 的每个唯一组合都是唯一的观察结果。 reshape 调用为您的每个 var1var20 的每个 n-id 组合提供一个观察 变量。所以现在有 4*20=80 个观察值。然后我只保留您希望使用 inlist() 保留的字符串。

对于第二个 reshape 调用,var 指定您要 reshape 的值在变量 var 中,并且您将使用它作为前缀。您希望每个剩余字母一行,所以我创建了一个新索引(最终没有实际意义),它成为第二次 reshape 调用的 i 索引(如果我使用 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 |
+-------------------------------------+

您可以轻松地添加在两次 reshape 之后都无法存活的变量。

* if you need to add back dropped variables
forvalues i =1/20 {
capture confirm variable var`i'
if _rc {
generate var`i' = ""
}
}

关于algorithm - 具有多个变量的数据管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13161738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com