2015-08-05 3 views
1

J'ai donc ces données et ce que je voudrais faire est de créer une variable qui reflète le groupe le plus haut statut chaque année. Chaque groupe peut avoir le statut: * 1 = Monopoly, * 2 = Dominant, * 3 = Principal, * 4 = Junior ou * 5 = Discriminé. Les groupes qui sont 1 ou 2 obtiendraient automatiquement le statut le plus élevé, car chaque pays n'aurait qu'un groupe qui détient ce statut au cours d'une année donnée. Certains pays ont toutefois plusieurs groupes appartenant à 3 (et 3 est aussi, parfois, le plus haut statut de groupe qui peut être atteint dans ce pays pour cette année) et dans ce cas, je voudrais le groupe avec la plus grande taille pour être codé comme celui avec le statut le plus élevé. Comment puis-je faire cela?itérations en cours en R pour créer une nouvelle variable avec des conditions spécifiques

données

D1 <- data.frame(row = c(1, 2, 3, 4, 5, 6, 7 , 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), 
      country = c("US", "US", "US", "US", "US", "US", "US", "US","US", "US", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada"), 
      year = c(1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995), 
      group = c("White", "White", "White", "White", "White", "Latino", "Latino", "Latino", "Latino", "Latino","English", "English", "English", "English", "English", "French", "French", "French", "French", "French"), 
      groupstatus = c("1", "1", "1", "3", "3", "5", "5","5", "3", "3", "2", "2", "2", "3", "3", "3", "3", "3", "3", "4"), 
      groupsize= c(0.7, 0.7, 0.7, 0.7, 0.7, 0.15, 0.15, 0.15, 0.15, 0.15, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2)) 

souhaité Sortie

D1 <- data.frame(row = c(1, 2, 3, 4, 5, 6, 7 , 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), 
country = c("US", "US", "US", "US", "US", "US", "US", "US","US", "US", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada", "Canada"), 
year = c(1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995, 1991, 1992, 1993, 1994, 1995), 
group = c("White", "White", "White", "White", "White", "Latino", "Latino", "Latino", "Latino", "Latino","English", "English", "English", "English", "English", "French", "French", "French", "French", "French"),    
groupstatus = c("1", "1", "1", "3", "3", "5", "5","5", "3", "3", "2", "2", "2", "3", "3", "3", "3", "3", "3", "4"), 
groupsize= c(0.7, 0.7, 0.7, 0.7, 0.7, 0.15, 0.15, 0.15, 0.15, 0.15, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2), 
highest= c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0)) 

Répondre

1

Voici une façon avec data.table.

Nous convertissons le 'data.frame' à 'data.table' (setDT(D1)). Regroupées par « pays » et « année », nous créons une colonne binaire « plus haut » en fonction de la présence de valeurs 1 et 2 dans le « GroupStatus » (Il pourrait aussi être fait en une seule étape, mais pour une meilleure compréhension je partage ce en haut). A l'étape suivante, regroupés par les mêmes colonnes, nous vérifions si tous les éléments de 'groupstatus' sont 3 (all(groupstatus==3)). Si tel est le cas, nous obtenons l'indice logique du maximum « groupsize » (groupsize==max(groupsize)) ou else (si certaines valeurs « GroupStatus » ne sont pas 3), nous recherchons des groupes avec des valeurs « plus » sont tous « 0 »ou 'faux' (!any(highest)) et 'GroupStatus' est 3 (groupstatus==3). Le vecteur logique résultant peut être modifié en index de ligne 'numérique' par .I. On extrait la colonne d'index de ligne ($V1) et l'utiliser pour modifier les valeurs de « plus haut » à 1.

setDT(D1)[, highest := +(groupstatus %in% 1:2) , .(country, year)] 
indx <- D1[, .I[if(all(groupstatus==3)) groupsize==max(groupsize) 
    else !any(highest)& groupstatus==3], .(country, year)]$V1 
D1[indx, highest := 1L] 
+0

Bonjour Akrun, je suis un double contrôle de mes données et pour une raison quelconque, ce code est convertissons TOUS les groupstatus == 3 au plus haut au lieu de celui qui est la plus grande taille dans une année donnée, étant donné qu'il n'y a pas de 1 ou 2 cette année-là. Pourriez-vous savoir pourquoi c'est? – rbeginner

+0

@rbeginner Une façon de vérifier est d'avoir un exemple qui l'imite. Pouvez-vous mettre à jour avec un nouvel exemple qui prendra soin d'elle. – akrun

+0

l'exemple aurait théoriquement imité le problème, mais lors de l'exécution dans l'ensemble de données complet, il semble y avoir des problèmes. Je ne sais pas exactement comment le faire mais il est impératif qu'il n'y ait qu'un seul groupe par année-pays à la fin. je vais poster le dput() d'un sous-ensemble de mes données. peut-être que cela aidera. – rbeginner