1
votes

Contracter l'ensemble de données pour ne contenir que des valeurs uniques pour une variable

En supposant que je dispose de l'ensemble de données suivant comme exemple de jouet:

Country                    Population_1   Population_2
United States of America       3999           3447
Afghanistan                     544            727
Belgium                        7546            992
China                         10000          12000

Je souhaite réduire l'ensemble de données afin qu'il n'y ait qu'une seule valeur unique pour le pays.

Mon L'ensemble de données final doit ressembler à ceci:

clear

input str32 Country Population_1 Population_2 
"United States of America" 3999 .
"United States of America" .  3447
"Afghanistan" 544 .
"Afghanistan" . 727
"Belgium" 7546 .
"Belgium" . 992
"China" 10000 .
"China" .  12000
end

J'ai essayé d'utiliser la commande collapse mais je n'ai pas obtenu le résultat attendu. La commande duplicates drop ne fonctionne pas non plus, car elle n'obtient pas les observations de Population_2.


0 commentaires

3 Réponses :


1
votes

Ce qui suit fonctionne pour moi:

generate Population_ = .

by Country, sort: replace Population_ = Population_2 if Population_1 == .
by Country, sort: replace Population_ = Population_1 if Population_2 == .

by Country: generate time = _n

drop Population_1 Population_2

reshape wide Population_, i(Country) j(time)


0 commentaires

1
votes

Cela fonctionne pour moi:

collapse Pop*, by(Country) 

list, abbreviate(12)

     +--------------------------------------------------------+
     |                  Country   Population_1   Population_2 |
     |--------------------------------------------------------|
  1. |              Afghanistan            544            727 |
  2. |                  Belgium           7546            992 |
  3. |                    China          10000          12000 |
  4. | United States of America           3999           3447 |
     +--------------------------------------------------------+


0 commentaires

0
votes

La commande contribuée par la communauté gcollapse peut également conserver les variables souhaitées dans l'ensemble de données:

gcollapse (sum) Pop*, merge replace by(Country)
duplicates drop Country, force


5 commentaires

Ceci est une réponse à une question différente.


c'était ma question initiale - mon ensemble de données d'origine contient de nombreuses autres variables que je souhaite conserver et que je souhaite uniquement réduire les variables de population. Dois-je créer une nouvelle question?


C'est peut-être dans votre esprit, mais nous ne le savons pas et vous n'avez pas modifié la question d'origine. Plus important encore, un collapse de certaines variables mais pas d'autres n'a aucun sens. Si une variable est numériquement constante dans (disons) des pays, sa valeur constante sera la moyenne de collapse ; si les valeurs distinctes d'une variable chaîne sont utiles ou intéressantes, elles appartiennent à by () . En tant qu'auteur original de doublons , je visualise avec alarme et sans approbation l'utilisation de l'option force ici sans justification; comme dans le reste de la vie, la force est au mieux le dernier recours des désespérés.


@NickCox fait un bon point. Notez que vous pouvez également faire de même avec quelques lignes de code supplémentaires et en utilisant uniquement les commandes intégrées.


au lieu de l'option force , est-il sage de simplement utiliser: drop if missing (City)