Home Forum Statistica con R Aiuto! Cicli for annidati

Tag: 

Questo argomento contiene 6 risposte, ha 2 partecipanti, ed è stato aggiornato da  chariotblack 2 mesi, 1 settimana fa.

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
  • Autore
    Articoli
  • #6490

    chariotblack
    Partecipante

    Buongiorno a tutti, è da poco che mi sono approcciata al mondo di R e sto facendo i conti con un progetto che prevede la manipolazione di dati forniti da Istat.
    Nel mio dataset ho una serie di colonne, fra cui:
    – una per le retribuzioni, cioè RETRIB;
    – una per il titolo di studio (di 4 livelli), cioè TISTUD;
    – una per la ripartizione geografica (di 3 livelli), cioè RIP3;
    – una per il sesso (2 livelli), SESSO.

    Ho bisogno di creare quattro barplot affiancati:
    1. uno che rappresenti gli individui senza titolo di studio (1° livello della variabile TISTUD), che confronti le retribuzioni MEDIE nelle macroregioni (rip3) fra uomo e donna (SESSO);
    2. una per i diplomati (2° livello di tistud) = = = ;
    3. uno per i laureati triennale = = = ;
    4. uno per i laureati magistrale = = = .

    Dovrò quindi creare quattro matrici 2×4, in cui le righe corrispondono al SESSO (degli individui relativi ad un particolare tistud) e le colonne corrispondono alle MACROREGIONI, quindi rip3.

    A questo punto, sono in grado di fare un unico ciclo for per far variare la macroregione, in questo modo:

    macro.auto1 <- vector() ### dichiaro l'oggetto come vettore vuoto
    
    mm <- c(1,2,3)
    
    for (mm in 1:3) {
     macro.auto1[[mm]] <- mean(retribuzioni[rip3==mm & sesso==1]) 
                         ### media retrib. uomini senza titolo nelle macroregioni
      
    }
    macro.auto1

    Poi farei la stessa cosa per sesso==2 (quindi le donne) e creerei la matrice con i due vettori risultati, ad esempio:
    matrice <- as.matrix(rbind(macro.auto1, macro.auto2))

    Mi chiedo: come potrei, con un unico passaggio (magari utilizzando più cicli for), far variare anche il sesso, senza quindi dover ripetere la stessa cosa due volte?
    Non riesco a trovare un modo per far capire ad R che quando sesso==1 deve creare il vettore macro.auto1 e quando sesso==2 il vettore macro.auto2, se non facendo la stessa operazione due volte.

    Oppure, realizzare la funzione in modo tale da riuscire a creare direttamente le quattro matrici di cui necessito, una per ogni livello di titolo di studio.
    Non so se io sia stata chiara, ma non ho ben capito come raggruppare i risultati ottenuti dal ciclo for in base alle condizioni…

    Grazie in anticipo a chi mi aiuterà ad uscirne 😀

    • Questo argomento è stato modificato 2 mesi, 1 settimana fa da  chariotblack.
    • Questo argomento è stato modificato 2 mesi, 1 settimana fa da  chariotblack.
    #6493
    Davide Massidda
    Davide Massidda
    Moderatore

    Potresti usare la funzione aggregate, risparmiandoti i cicli for 🙂

    Una cosa di questo tipo:

    aggr_data <- aggregate(RETRIB ~ TISTUD * SESSO, FUN=mean, data=tuo_dataset)

    #6494

    chariotblack
    Partecipante

    Wow! Effettivamente così è molto più veloce, ma come faccio a creare le quattro matrici dai dati forniti dalla funzione aggregate()?

    #6495
    Davide Massidda
    Davide Massidda
    Moderatore

    Il vantaggio di usare aggregate sta proprio nel fatto che questa prende in pasto il dataset originario: se dovessi stare a stratificare manualmente il dataset con dei for, allora a quel punto non avrebbe molto senso usarla.

    Trovi qualche spiegazione qui.

    #6496

    chariotblack
    Partecipante

    Sì, questo mi è chiaro.
    Ora però ho un risultato del genere,

    > aggr_data
       tistud sesso rip3 retribuzioni
    1       1     1    1    1193.7590
    2       2     1    1    1287.2991
    3       3     1    1    1368.4559
    4       4     1    1    1494.0625
    5       1     2    1     921.1013
    6       2     2    1    1029.0960
    7       3     2    1    1229.6903
    8       4     2    1    1324.0741
    9       1     1    2    1101.1515
    10      2     1    2    1122.9341
    11      3     1    2    1292.3256
    12      4     1    2    1493.4043
    13      1     2    2     797.2222
    14      2     2    2     913.8710
    15      3     2    2    1111.7857
    16      4     2    2    1206.7647
    17      1     1    3     943.0000
    18      2     1    3    1033.3799
    19      3     1    3    1110.3448
    20      4     1    3    1305.6250
    21      1     2    3     639.5946
    22      2     2    3     821.9397
    23      3     2    3     943.9286
    24      4     2    3    1139.2500

    e ho necessità di estrarre per ogni livello di tistud, le retribuzioni medie per sesso e rip3.
    Cioè, per tistud=1:

            Rip3    1    2    3
    sesso 1         -    -    -
          2         -    -    -

    E così per tutti gli altri 3 livelli di tistud… provando ad estrarre con le quadre e cbind sembra non funzioni :\

    • Questa risposta è stata modificata 2 mesi, 1 settimana fa da  chariotblack.
    #6498
    Davide Massidda
    Davide Massidda
    Moderatore

    Come non funziona? Che errore ti restituisce questo codice?

    aggr_data[aggr_data$tistud == 1 , ]

    Quelli che vedo sono valori numerici oppure sono numeri inseriti all’interno di stringhe?

    #6499

    chariotblack
    Partecipante

    Ho risolto così!

    aggr_data <- aggregate(retribuzioni ~ tistud * sesso * rip3, FUN=mean, data=dati2)
    
    m_no.titolo <- aggr_data[aggr_data$tistud==1,2:4]
    m_diplomati <- aggr_data[aggr_data$tistud==2,2:4]
    m_triennale <- aggr_data[aggr_data$tistud==3,2:4]
    m_magistrale <- aggr_data[aggr_data$tistud==4,2:4]
    
    matrix_m_no.titolo <- as.matrix(round(cbind(m_no.titolo[1:2,3],m_no.titolo[3:4,3],m_no.titolo[5:6,3])))
    dimnames(matrix_m_no.titolo)[[1]]<- c("uomo", "donna")
    dimnames(matrix_m_no.titolo)[[2]]<- c("Nord", "Centro", "Sud")
      
    matrix_m_diplomati <- as.matrix(round(cbind(m_diplomati[1:2,3],m_diplomati[3:4,3],m_diplomati[5:6,3])))
    dimnames(matrix_m_diplomati)[[1]]<- c("uomo", "donna")
    dimnames(matrix_m_diplomati)[[2]]<- c("Nord", "Centro", "Sud")
      
    ..ecc

    Da queste matrici ho poi fatto i plot che mi servivano 😀
    Grazie davvero! Il tuo aiuto è stato davvero prezioso!!

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)

Devi essere loggato per rispondere a questa discussione.