Home Forum Statistica con R ordinamento intero dataframe

This topic contains 8 replies and has 2 voices.

Viewing 9 posts - 1 through 9 (of 9 total)
  • Author
    Posts
  • #4680

    giupar93
    Participant

    Buon pomeriggio a tutti,

    vorrei ordinare un intero dataframe con un ordinamento decrescente per colonna, e creare allo stesso tempo un dataframe di adiacenza che conterrà per ogni colonna gli indici originali ordinati. In altre parole vorrei che l’indice segua il numero a cui è associato nel momento in cui il numero viene ordinato. Ho creato questo ciclo for che esattamente fà ciò che voglio:

    for(i in 1:dim(df)[2]){
      index<-cbind(index,
                       as.data.frame(row.names(df[order(df[,i], decreasing=T),i,drop=F])))
      }
    

    ovviamente vorrei non utilizzare il ciclo for, come fare?

    Spero che esista un soluzione migliore..grazie mille anticipatamente a tutti :)

    Buon weekend

    #4681

    Ciao giupar!
    non riesco a immaginare la struttura del tuo dataframe e l’output che produce il tuo ciclo.
    Potresti mostrare un paio di righe del dataframe originale e un paio di righe di come risulta nell’output?

    #4682

    giupar93
    Participant

    certamente!

    https://s11.postimg.org/uhddhhuhv/Schermata_a_2017-05-12_14-20-37.png

    in questa prima immagine troverai un pezzo di dataframe, ogni singola colonna di esso deve essere ordinata in modo decrescente

    https://s17.postimg.org/gelz99wb3/Schermata_a_2017-05-12_14-21-39.png

    in questa seconda immagine troverai gli indici (TCGA) di ogni singola colonna che è ordinata in modo decrescente in base all’ordinamento precedente.

    Spero di essere stato abbastanza chiaro, eventualmente chiedimi ancora chiarimenti.
    GRAZIE!

    • This reply was modified 7 months ago by  giupar93.
    • This reply was modified 7 months ago by  giupar93.
    • This reply was modified 7 months ago by  giupar93.
    • This reply was modified 7 months ago by  giupar93.
    #4688

    Dovrei aver capito, correggimi se non dovessi aver capito.
    Avendo questa porzione di dataset:

    
    arh <- c(-0.29, 0.60, -0.30) 
    hif <- c(-1.34, -1.93, -2.33)
    df <- data.frame(arh, hif)
    row.names(df) <- c("EE-A2GE-06", "ER-A193-06", "EB-A3Y6-01")
    
    df
                 arh   hif
    EE-A2GE-06 -0.29 -1.34
    ER-A193-06  0.60 -1.93
    EB-A3Y6-01 -0.30 -2.33
    

    Potresti ottenere lo stesso risultato ma utilizzando sapply() che rende l’operazione molto più veloce del ciclo for nel caso tu abbia un dataset molto esteso:

    
    index <- data.frame(sapply(seq_along(df), function(x) {
        row.names(df[order(df[x], decreasing=T), x,drop=F])
      }))
    names(index) <- paste(names(df), "decr", sep = "_")
    
    cbind(df, index)
                 arh   hif   arh_desc   hif_desc
    EE-A2GE-06 -0.29 -1.34 ER-A193-06 EE-A2GE-06
    ER-A193-06  0.60 -1.93 EE-A2GE-06 ER-A193-06
    EB-A3Y6-01 -0.30 -2.33 EB-A3Y6-01 EB-A3Y6-01
    

    sapply non fa altro che applicare una determinata funzione a tutti gli elementi di un determinato oggetto. In questo caso a tutte le colonne del dataframe.

    #4693

    giupar93
    Participant

    grazie mille della risposta, stavo provando ad eseguire quello che hai scritto tu in modo tale da rendermi conto della correttezza, ma all’interno della funzione sapply hai messo una i, hai sbagliato oppure questo codice devo metterlo sempre all’interno del for?

    #4697

    Hai ragione scusami ho dimenticato un indice che ha fatto passare il comanda nella mia console solo perché avevo prima provato il tuo ciclo!

    Ho modificato la mia risposta e ora dovrebbe andare. Fammi sapere

    #4698

    Un altro metodo che potresti utilizzare è attraverso l’utilizzo di alcune funzioni molto utili del pacchetto dplyr:

    
    install.packages("dplyr")
    library(dplyr)
    
    index <- df %>% 
      mutate_all(funs(decr = order(., decreasing=T)))
    rownames(index) <-rownames(df)
    
    index
                 arh   hif arh_decr hif_decr
    EE-A2GE-06 -0.29 -1.34        2        1
    ER-A193-06  0.60 -1.93        1        2
    EB-A3Y6-01 -0.30 -2.33        3        3
    

    Anche questo metodo è più veloce rispetto all’utilizzo del ciclo for. Tuttavia come puoi vedere non sono riuscito a capire come assegnare alle nuove colonne le etichette corrispondenti ai nomi di riga. Ma in ogni caso hai indicate le posizioni di riga, e utilizzando quelle puoi richiamare sia i nomi di riga corrispondenti che la variabile interessata nell’ordine decrescente:

    
    rownames(index)[index$arh_decr]
    [1] "ER-A193-06" "EE-A2GE-06" "EB-A3Y6-01"
    
    index$arh[index$arh_decr]
    [1]  0.60 -0.29 -0.30
    

    Per un introduzione a dplyr puoi guardare qui: https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

    #4700

    giupar93
    Participant

    Grazie mille per lo script..ti farò sapere il prima possibile se è ciò che cercavo.
    comunque sia GRAZIE

    #4701

    giupar93
    Participant

    Grazie mille..ho appena provato ed è proprio quello che mi serviva :D

    Grazie ancora e buon fine settimana

Viewing 9 posts - 1 through 9 (of 9 total)

You must be logged in to reply to this topic.