从这个斯塔塔常见问题,我知道我问题的第一部分的答案。但在这里,我想再走一步。假设我有以下数据(已按未显示的变量排序):
id v1
A 9
B 8
C 7
B 7
A 5
C 4
A 3
A 2 要计算这个序列中的最小值,我需要
generate minsofar = v1 if _n==1
replace minsofar = min(v1[_n-1], minsofar[_n-1]) if missing(minsofar)要获得
id v1 minsofar
A 9 9
B 8 9
C 7 8
B 7 7
A 5 7
C 4 5
A 3 4
A 2 3 现在,我想生成一个变量,称为id_min,它为我提供了与minsofar关联的ID,所以类似于
id v1 minsofar id_min
A 9 9 A
B 8 9 A
C 7 8 B
B 7 7 C
A 5 7 C
C 4 5 A
A 3 4 C
A 2 3 A请注意,C与7相关联,因为在当前排序中,7首先与C关联。为了便于阅读,我这里的ID变量显示为字符串变量--实际上是数字变量。
想法?
编辑:
我想
gen id_min = id if _n<=2
replace id_min = id[_n-1] if v1[_n-1]<minsofar[_n-1] & missing(id_min)
replace id_min = id_min[_n-1] if missing(id_min)至少对本例中的数据执行此工作。不知道它是否适用于更复杂的案件。
发布于 2014-10-16 09:21:36
到目前为止,这比暗示的要容易一些,也更具有挑战性。例如,考虑到value (比OP的v1更容易引起人们的注意)和到目前为止保持最低记录的愿望
generate min_so_far = value[1]
replace min_so_far = value if value < min_so_far[_n-1] in 2/L 其中第二个陈述利用了不令人惊讶的事实,斯塔塔replace是按目前的顺序观察。[_n-1]是前一次观测的索引,in 2/L意味着从第二次到最后一次对所有观测的循环。
请注意,OP的版本是错误的:通过始终查看前面的观察结果,代码永远不会查看最后一个值,如果它是一个新的最小值,则会忽略这一点。也许OP真的想要“以前的最低限度”,但这不是我所理解的“到目前为止的最低限度”。
如果我们在value中有缺失的值,他们不会以任何恶意的方式输入比较: Stata总是认为缺失是任意大的,所以只有在目前为止没有非缺失的情况下,才会记录缺失,这是应该的。
乍一看,该最小值的标识符将产生相同的逻辑。
generate min_so_far = value[1]
gen id_min = id[1]
replace min_so_far = value if value < min_so_far[_n-1] in 2/L
replace id_min = id if value < min_so_far[_n-1] in 2/L 至少有两个曲折可能会咬人。OP提到了一个可能的情况,即标识符可能丢失,因此我们可能有一个新的最小值,但不知道它的标识符。刚才给出的代码将使用缺少的标识符,但是如果希望用已知的标识符单独跟踪最小值的标识符,则需要不同的代码。
迄今没有提到的一个问题是,迄今为止,具有不同标识符的观测都可能具有相同的最小值。上面的代码只在第一次看到特定的最小值时才替换标识符;如果希望记录最后一次出现的标识符,那么上面最后一行的<应该替换为<=。如果希望跟踪到目前为止最小值的所有标识符,则需要一个字符串变量来连接所有标识符。
在面板或纵向数据的结构下,整个工作是在by:的主持下完成的。
我看不出有必要在这里使用用户写的扩展。
发布于 2014-10-16 03:53:02
这适用于你的例子。它使用用户编写的命令vlookup,您可以安装它,运行findit vlookup并通过显示的链接进行跟踪。
clear
set more off
input ///
str1 id v1
A 9
B 8
C 7
B 7
A 5
C 4
A 3
A 2
end
encode id, gen(id2)
order id2
drop id
list
*----- what you want -----
// your code
generate minsofar = v1 if _n==1
replace minsofar = min(v1[_n-1], minsofar[_n-1]) if missing(minsofar)
// save original sort
gen osort = _n
// group values of v1 but respecting original sort so values of
// id2 don't jump around
sort v1 osort
// set obs after first as missing so id2 is unique within v1
gen v2 = v1
by v1: replace v2 = . if _n > 1
// lookup
vlookup minsofar, gen(idmin) key(v2) value(id2)
// list
sort osort
drop osort v2
list, sep(0)您的代码有generate minsofar = v1 if _n==1,它更好地编码为generate minsofar = v1 in 1,因为它更高效。
您的minsofar变量只是v1的替代副本,所以如果总是这样,那么应该有更简单的方法来处理您的问题。到目前为止,我怀疑你的问题比你承认的要容易,这是通过你的职位。也许给出更多的上下文,扩展的示例数据,等等,可以得到更好的建议。
https://stackoverflow.com/questions/26395627
复制相似问题