Domanda:
Calcolo delle proporzioni per età in R
GKED
2011-03-04 00:48:35 UTC
view on stackexchange narkive permalink

Sto lavorando su questo set di dati con stato civile ed età. Voglio tracciare la percentuale di uomini mai sposati rispetto a ciascuna età. Potresti per favore aiutarmi a capire come farlo in R? Finora ho creato due schiere separate con uomini che non si sposano e non si sposano mai. So quanti casi di ciascuno ho. Quello che devo fare è contare il numero di persone che non si sono mai sposate ad ogni età e dividerlo per il numero totale di persone mai sposate per ottenere una percentuale. Spero di essere stato chiaro. Grazie

Potresti pubblicare uno snippet dei tuoi dati, in modo da avere un'idea migliore di ciò che desideri manipolare?
Tre risposte:
#1
+10
Bernd Weiss
2011-03-04 01:44:18 UTC
view on stackexchange narkive permalink

Il tuo approccio mi sembra troppo complicato. Cominciamo con alcuni dati:

  ## make up some datastatus <- factor (rbinom (1000, 1, 0.3), labels = c ("single", "married")) age < - sample (20:50, 1000, replace = TRUE) df <- data.frame (status, age) head (df)  

Stampa i primi sei casi:

  > head (df) status age1 sposato 212 single 503 single 434 single 285 sposato 286 single 40  

Successivamente, dobbiamo calcolare le percentuali di riga; anche se dubito che questo abbia senso (si riferisce alla tua affermazione: "Quello che devo fare è contare il numero di persone che non si sono mai sposate ad ogni età e dividerlo per il numero totale di persone mai sposate per ottenere una percentuale. ").

  ## calcola le percentuali per riga (è quello che stai cercando?) (tab <- prop.table (table (df), 1) * 100)  

La tabella risultante ha questo aspetto:

  > (tab <- prop.table (table (df), 1) * 100) agestatus 20 21 22 23 24 25 26 celibe 1.857143 3.142857 3.428571 2.285714 2.142857 2.857143 3.428571 sposato 2.333333 2.333333 5.666667 1.333333 3.333333 5.333333 2.000000 agestatus 27 28 29 30 31 32 33 single 2.857143 3.142857 3.428571 3.285714 2.766.00 4.300 3.33333 3.333333 5.333333 2.000000 agestatus 27 28 29 30 31 32 33 single 2.857143 3.142857 3.428571 3.285714 2.766.00 4.300 3.336 agestatus 3.33333 5.333334 37 38 39 40 single 3.000000 2.857143 5.000000 3.571429 2.857143 3.571429 3.000000 sposato 3.333333 4.000000 4.000000 2.333333 2.000000 2.000000 2.000000 agestatus 41 42 43 44 45 46 47 single 4.285714 3.000000 3.003.333333 4.000000 4.000000 2.333333 2.000000 2.000000 2.000000 agestatus 41 42 43 44 45 46 47 single 4.285714 3.000000 3.714286 3.8571466 2.85733 2.6733 2.85733 2.6733 2.85733 2.85733 2.85733 2.6733 2.85733 2.85733 2.85733 2.85733 2.85733
single 2.857143 3.428571 4.857143 sposato 2.333333 3.000000 3.666667  

Cioè, se si somma la riga saggia, si ottiene il 100%

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

Infine, tracciarlo.

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

enter image description here

Grazie mille. È esattamente quello che stavo cercando di fare.
#2
+5
Matt Parker
2011-03-04 01:57:08 UTC
view on stackexchange narkive permalink

Ho fatto qualcosa di simile di recente. Ci sono diversi modi per aggregare dati come questo in R, ma la funzione ddply dal pacchetto plyr è la mia coperta di sicurezza, e mi rivolgo ad essa per cose come questa .

Presumo che tu abbia record individuali per ogni persona nel tuo set di dati, con età, sesso e stato civile. Non è necessario suddividere i dati in più tabelle per questo approccio: se nella tabella originale sono presenti donne, è sufficiente lasciarle e aggiungere il sesso come variabile di raggruppamento.

  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 "," Divorced "))) / nrow (x))})  

Questo divide data.frame yourdata per combinazioni uniche delle variabili sesso e age . Quindi, per ciascuno di questi blocchi (indicato come x ), calcola il numero di persone che appartengono a quel gruppo ( n ), quante di loro sono sposate ( ever.married.n ) e quale percentuale di loro sono sposati ( ever.married.prop ). Quindi restituirà un data.frame chiamato results.by.age con righe come

  sex age n ever.married.n ever.married.prop "Male" 25 264167 0,633  

Questo forse non è il modo più elegante o efficiente per farlo, ma questo schema generale è stato molto utile per me. Un vantaggio di questo è che puoi raccogliere facilmente e in modo trasparente tutte le statistiche che desideri dal sottoinsieme, il che può essere utile se, ad esempio, vuoi aggiungere una linea di regressione al grafico (peso per n ) oppure avere proporzioni sia maschili che femminili sulla stessa trama e colorare i punti in base al sesso.


Ecco una versione rivista che utilizza la funzione summarize () di plyr - l'effetto è lo stesso, ma summarize () ha un paio di vantaggi chiave: - Funziona all'interno dell'ambiente del sottoinsieme corrente, quindi invece di digitare x $ marital.status , Posso semplicemente digitare marital.status . - Mi consente di fare riferimento ad altre variabili che ho già creato, il che rende molto più facili percentuali, trasformazioni e simili - se ho già creato num e denom , il la proporzione di num è solo num / denom .

  results.by.age <- ddply (.data = yourdata, .var = c ("sesso", "età"), .fun = riepilogo, n = lunghezza (stato.marital), ever.married = sum (marital.status% in% c ("Married", "Divorced")), ever .married.prop = ever.married / n # Riferito a vars che ho appena creato)  
#3
+2
nico
2011-03-04 01:29:43 UTC
view on stackexchange narkive permalink

Probabilmente ciò di cui hai bisogno è table o aggregate . Se aggiungi ulteriori dettagli posso darti una spiegazione più approfondita.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 2.0 con cui è distribuito.
Loading...