Question:
Calcul des proportions par âge en R
GKED
2011-03-04 00:48:35 UTC
view on stackexchange narkive permalink

Je travaille sur cet ensemble de données avec l'état matrimonial et l'âge. Je veux tracer le pourcentage d'hommes jamais mariés par rapport à chaque âge. Pourriez-vous s'il vous plaît m'aider à comprendre comment le faire en R? Jusqu'à présent, j'ai créé deux tableaux distincts avec des hommes qui ne se marient jamais et ne se sont jamais mariés. Je sais combien de cas de chacun j'ai. Ce que je dois faire, c'est compter le nombre de personnes qui ne se sont jamais mariées à chaque âge et le diviser par le nombre total de personnes jamais mariées pour obtenir un pourcentage. J'espère avoir été clair. Merci

Pourriez-vous publier un extrait de vos données, afin que nous ayons une meilleure idée de ce que vous souhaitez manipuler?
Trois réponses:
#1
+10
Bernd Weiss
2011-03-04 01:44:18 UTC
view on stackexchange narkive permalink

Votre approche me semble bien trop compliquée. Commençons par quelques données:

  ## composent un état des données <- factor (rbinom (1000, 1, 0.3), labels = c ("single", "Married")) age < - sample (20:50, 1000, replace = TRUE) df <- data.frame (status, age) head (df)  

Imprimer les six premiers cas:

> statut de tête (df) âge1 marié 212 célibataire 503 célibataire 434 célibataire 285 marié 286 célibataire 40

Ensuite, nous devons calculer les pourcentages par ligne; même si je doute que cela ait du sens (cela fait référence à votre déclaration: "Ce que je dois faire, c'est compter le nombre de personnes qui ne se sont jamais mariées à chaque âge et le diviser par le nombre total de personnes jamais mariées pour obtenir un pourcentage. ").

  ## calculer les pourcentages par ligne (est-ce ce que vous cherchez?) (tab <- prop.table (table (df), 1) * 100)  

Le tableau résultant ressemble à ceci:

  > (tab <- prop.table (table (df), 1) * 100) agestatus 20 21 22 23 24 25 26 célibataire 1.857143 3.142857 3.428571 2.285714 2.142857 2.857143 3.428571 marié 2.333333 2.333333 5.666667 1.333333 3.333333 5.333333 2.000000 agestatus 27 28 29 30 31 32 33 célibataire 2.857143 3.142857 3.428571 3.285714 2.714280000 agé 37 38 39 40 célibataire 3.000000 2.857143 5.000000 3.571429 2.857143 3.571429 3.000000 marié 3.333333 4.000000 4.000000 2.333333 2.000000 2.000000 2.000000 agestatus 41 42 43 44 45 46 47 célibataire 4.285714 3.000000 3.714286 3.857143 2.857143 3.71433333 2.000000 2.000000 2.000000 agestatus 41 42 43 44 45 46 47 célibataire 4.285714 3.000000 3.714286 3.857143 2.857143 3.71433333 2.000000 2.000000 2.000000 agestatus 41 42 43 44 45 46 47 célibataire 4.285714 3.000000 3.714286 3.857143 2.857143 3.71433333 2.333366 2.333366 2.3333366 ag.
célibataire 2.857143 3.428571 4.857143 marié 2.333333 3.000000 3.666667  

Autrement dit, si vous résumez les lignes, cela donne 100%

  > sum (tab [1, ]) [1] 100  

Enfin, tracez-le.

  ## plot itplot (as.numeric (dimnames (tab) $ age), tab [1,], xlab = "Age", ylab = "Single [%]")  

enter image description here

Merci beaucoup. C'est exactement ce que j'essayais de faire.
#2
+5
Matt Parker
2011-03-04 01:57:08 UTC
view on stackexchange narkive permalink

J'ai fait quelque chose de similaire récemment. Il y a plusieurs façons d'agréger des données comme celle-ci dans R, mais la fonction ddply du package plyr est ma couverture de sécurité, et je me tourne vers elle pour des choses comme celle-ci .

Je suppose que vous avez des enregistrements individuels pour chaque personne de votre ensemble de données, avec l'âge, le sexe et l'état matrimonial. Il n'est pas nécessaire de diviser les données en plusieurs tables pour cette approche - si vous avez des femmes dans la table d'origine, laissez-les simplement et ajoutez le sexe comme variable de regroupement.

  require (plyr) results.by.age <- ddply (.data = yourdata, .var = c ("sex", "age"), .fun = function (x) {data.frame (n = nrow (x), ever.married .n = nrow (subset (x, marital.status% in% c ("Married", "Divorced"))), ever.married.prop = nrow (subset (x, marital.status% in% c ("Married "," Divorcé "))) / nrow (x))})  

Ceci divise le data.frame yourdata par des combinaisons uniques des variables sexe et age . Ensuite, pour chacun de ces morceaux (appelés x ), il calcule le nombre de personnes qui appartiennent à ce groupe ( n ), combien d'entre elles sont mariées ( ever.married.n ), et quelle proportion d'entre eux sont mariés ( ever.married.prop ). Il renverra alors un data.frame appelé results.by.age avec des lignes comme

  sexe age n ever.married.n ever.married.prop "Male" 25 264 167 0,633  

Ce n'est peut-être pas la manière la plus élégante ou la plus efficace de le faire, mais ce schéma général m'a été très utile. Un avantage de ceci est que vous pouvez facilement et de manière transparente collecter les statistiques que vous voulez du sous-ensemble, ce qui peut être utile si vous voulez, par exemple, ajouter une ligne de régression au graphique (pondération par n ) ou avoir à la fois des proportions masculines et féminines sur le même tracé et colorer les points par sexe.


Voici une version révisée utilisant la fonction summary () de plyr - l'effet est le même, mais summary () présente quelques avantages clés: - Il fonctionne dans l'environnement du sous-ensemble actuel - donc plutôt que de taper x $ marital.status , Je peux simplement taper marital.status . - Cela me permet de me référer à d'autres variables que j'ai déjà créées, ce qui facilite beaucoup les pourcentages, les transformations et autres - si j'ai déjà fait num et denom , le proportion de num est juste num / denom .

  results.by.age <- ddply (.data = yourdata, .var = c ("sexe", "âge"), .fun = résumé, n = longueur (marital.status), ever.married = sum (marital.status% in% c ("Married", "Divorced")), jamais .married.prop = ever.married / n # Se référant aux variables que je viens de créer)  
#3
+2
nico
2011-03-04 01:29:43 UTC
view on stackexchange narkive permalink

Vous avez probablement besoin d'une table ou d'un agrégat . Si vous ajoutez plus de détails, je peux vous donner une explication plus approfondie.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 2.0 sous laquelle il est distribué.
Loading...