从this Stata FAQ开始,我知é“问题第一部分的ç”案。但在这里,我想更进一æ¥ã€‚å‡è®¾æˆ‘有以下数æ®ï¼ˆå·²ç»æŒ‰æœªæ˜¾ç¤ºçš„å˜é‡æŽ’åºï¼‰ï¼š
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)
至少为这个例åä¸çš„æ•°æ®åšäº†å·¥ä½œã€‚ä¸çŸ¥é“它是å¦é€‚用于更å¤æ‚的案例。
ç”案 0 :(得分:1)
这适用于您的示例。它使用用户编写的命令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
的移ä½å‰¯æœ¬ï¼Œå› æ¤å¦‚果情况总是如æ¤ï¼Œåˆ™åº”该有更简å•çš„方法æ¥å¤„ç†æ‚¨çš„é—®é¢˜ã€‚æˆ‘æ€€ç–‘ä½ çš„é—®é¢˜æ¯”ä½ çŽ°åœ¨æ‰¿è®¤çš„æ›´å®¹æ˜“ï¼Œè€Œä¸”è¿™å·²ç»é€šè¿‡ä½ 的帖å了。也许æ供更多背景,扩展示例数æ®ç‰å¯ä»¥ä¸ºæ‚¨æ供更好的建议。
ç”案 1 :(得分:0)
到目å‰ä¸ºæ¢ï¼Œè¿™æ¯”默示更容易,也更具挑战性。给定value
(比OP v1
更令人回味)并希望到目å‰ä¸ºæ¢è·Ÿè¸ªæœ€å°å€¼ï¼Œä¾‹å¦‚
generate min_so_far = value[1]
replace min_so_far = value if value < min_so_far[_n-1] in 2/L
å…¶ä¸ç¬¬äºŒä¸ªè¯å¥åˆ©ç”¨Stata replace
在当å‰è§‚察顺åºä¸çš„ä¸è¶³ä¸ºå¥‡çš„事实。 [_n-1]
是先å‰è§‚察的索引,in 2/L
表示从第二个到最åŽä¸€ä¸ªè§‚察的所有观察的循环。
请注æ„OP的版本是错误的:通过始终查看之å‰çš„观察,代ç 永远ä¸ä¼šæŸ¥çœ‹æœ€åŽä¸€ä¸ªå€¼ï¼Œå¦‚果它是一个新的最å°å€¼ï¼Œå°†å¿½ç•¥å®ƒã€‚å¯èƒ½OP在æ¤ä¹‹å‰çœŸæ£æƒ³è¦ï¼†ï¼ƒ34;最å°åŒ–&#34;但到目å‰ä¸ºæ¢ï¼Œè¿™å¹¶ä¸æ˜¯æˆ‘所ç†è§£çš„最低水平。
如果我们在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:
的支æŒä¸‹å®Œæˆçš„。
æˆ‘æ— æ³•åœ¨æ¤å¤„寻求用户编写的扩展程åºã€‚