2017-10-17 14 views
0

Problème général: Je ne comprends pas comment créer une valeur basée sur une condition provenant d'autres groupes. Je voudrais faire quelque chose comme:Marquer des rangées conditionnellement d'un groupe en fonction des données d'un autre groupe

gen x = cond(cond1==1 & cond2==1, value[**of some other row in a different group**], other_value) 

problème spécifique: Étant donné un ensemble de données massif qui a des groupes en fonction de id qui ne change jamais, et un identifiant secondaire (co_id) qui. Chaque groupe a plusieurs lignes qui se répètent dans time. Chaque rangée a un drapeau (is_a) qui indique une relation avec un autre groupe (c'est-à-dire, id) à un certain moment. La relation est indiquée par un changement à co_id donc il est égal à l'autre groupe.

Je suis en train de faire deux choses:

  1. pour les lignes battant pavillon (is_a == 1) trouver le id du groupe que le nouveau co_id appartient et
  2. Pour cet autre groupe, drapeau de l'année que la connexion a été faite

enter image description here

Dans l'exemple ci-dessus, Grou p 111 a été connecté au groupe 222 dans le temps 11 (une connexion est faite qu'une seule fois). Basé sur le nouveau co_id'xzx' Je veux indiquer le id222 à partir de ce moment-là. Notez que les autres groupes peuvent avoir cette co_id, mais la correcte est l'apparition la plus ancienne de ce co_id dans les données (de sorte que l'un est 222 et non 777).

Pour le groupe 222, alors je signale cette heure lorsque la connexion a été établie (time == 11).

Les données de l'échantillon:

clear 
input int id byte(is_a time) str3 co_id 
111 0 10 "abc" 
111 0 10 "abc" 
111 1 11 "xzx" 
111 1 11 "xzx" 
111 1 12 "xzx" 
111 1 12 "xzx" 
222 0 10 "xzx" 
222 0 10 "xzx" 
222 0 11 "xzx" 
222 0 11 "xzx" 
222 0 12 "xzx" 
222 0 12 "xzx" 
777 1 13 "xzx" 
end 

Merci à l'avance!

+1

S'il vous plaît donner un exemple de personnes de données peuvent copier et coller. 'ssc inst dataex' vous permet de fournir un petit exemple de données en tant que code' input'. Combien de personnes sont disposées à retaper ce qu'elles voient dans une image? En outre, le terme _rows_ est étranger aux discussions de Stata tout comme les observations seraient des tableurs. –

+0

Il y a une commande écrite par l'utilisateur appelé 'vlookup' dont l'approche que vous pourriez réutiliser, mais il ne fonctionnera pas impromptu. –

+0

@NickCox ajouté. Désolé et merci! –

Répondre

0

Je pense que l'un des problèmes était que j'étais mentalement bloqué en utilisant id comme base pour mes opérations de regroupement.L'utilisation co_id aidé ici, avec quelques par tri:

sort co_id time id 
by co_id: gen id_co = id[1] if is_a==1 

que de créer une variable d'aide pour vérifier si le co_id a changé depuis la dernière time:

sort id time 
by id: gen changed_co_id = cond(co_id[_n]!= co_id[_n-1], 1, 0) 
by id: replace changed_co_id = 0 if _n==1 
by id time: replace changed_co_id = 1 if changed_co_id[1]==1 

Maintenant, je peux créer le drapeau pour l'autre groupe pour indiquer que la connexion a été faite:

#delimit ; 
sort co_id time is_a changed_co_id; 
by co_id time: gen is_conn = cond(is_a==0 & 
         changed_co_id==0 & 
         is_a[_N]==1 & 
         changed_co_id[_N]==1, 1, 0); 
#delimit cr 

Ainsi, afin de créer le drapeau que nous devons trier par co_id afin que nous puissions les deux id s des groupes connectés, par time afin qu'ils puissent coexister au moment de la connexion (et au-delà) et par changed_co_id afin que nous puissions trouver le time exact où la connexion a été fait - aussi, cet arrangement s'assure que les observations nouvellement connectées apparaissent à la fin de chaque groupe. Ensuite, nous signalons les observations du groupe qui a initié la connexion: si elles ne sont pas connectées elles-mêmes et si la dernière observation est, et nouvellement ainsi.