2014-12-18 29 views
11

Voglio rappresentare la struttura di un frame di dati (o matrice, o data.table qualunque) su un singolo grafico con codifica a colori. Immagino che potrebbe essere molto utile per molte persone che gestiscono vari tipi di dati, per visualizzarli in un colpo d'occhio.struttura visiva di un data.frame: posizioni di NA e molto altro

Forse qualcuno ha già sviluppato un pacchetto per farlo, ma non sono riuscito a trovarne uno (solo this). Così qui è un mockup approssimativa della mia "visione", una specie di heatmap, mostrando in codici colore:?

  • le posizioni NA,
  • la classe di variabili (fattori (quanti livelli), numerici (con gradiente di colore, zeri, valori anomali ...), stringhe)
  • dimensioni
  • ecc .....

enter image description here

S o lontano che ho appena scritto una funzione per tracciare le posizioni NA va in questo modo:

ggSTR = function(data, alpha=0.5){ 
    require(ggplot2) 
    DF <- data 
    if (!is.matrix(data)) DF <- as.matrix(DF) 

    to.plot <- cbind.data.frame('y'=rep(1:nrow(DF), each=ncol(DF)), 
           'x'=as.logical(t(is.na(DF)))*rep(1:ncol(DF), nrow(DF))) 
    size <- 20/log(prod(dim(DF))) # size of point depend on size of table 
    g <- ggplot(data=to.plot) + aes(x,y) + 
     geom_point(size=size, color="red", alpha=alpha) + 
     scale_y_reverse() + xlim(1,ncol(DF)) + 
     ggtitle("location of NAs in the data frame") 

    pc <- round(sum(is.na(DF))/prod(dim(DF))*100, 2) # % NA 
    print(paste("percentage of NA data: ", pc)) 

    return(g) 
} 

Prende qualsiasi data.frame in input e restituisce questa immagine:

enter image description here

è troppo grande una sfida per me per raggiungere la prima immagine.

+0

il pacchetto rdataviewer potrebbe fornire un utile punto di partenza – baptiste

+1

Un post SO correlato è apparso e potrebbe essere di interesse: [Ispezione e visualizzazione di spazi vuoti/spazi vuoti e struttura in dataframes di grandi dimensioni] (http: // stackover flow.com/q/28813057/2727349) – swihart

risposta

2

alla fine ho venire con uno script per tracciare la maggior parte delle specifiche. Lo invio qui, alcuni potrebbero essere interessati anche se la sintassi è lungi dall'essere "elegante"!

noti che la principale funzione 'colstr' ha 3 argomenti - un ingresso (DF o matrice o anche solo vettore) - un numero massimo fila per tracciare - un'opzione per esportare png nella directory di lavoro.

l'uscita dà, per esempio: enter image description here

# PACKAGES 
require(ggplot2) 
require(RColorBrewer) 
require(reshape2) 

# Test if an object is empty (data.frame, matrix, vector) 
is.empty = function (input) { 
    df <- data.frame(input) 
    (is.null(df) || nrow(df) == 0 || ncol(df) == 0 || NROW(df) == 0) 
} 

# min/max normalization (R->[0;1]), (all columns must be numerical) 
minmax <- function(data, ...) { 
    .minmax = function(x) (x-min(x, ...))/(max(x, ...)-min(x, ...)) 
    # find constant columns, replaces with O.5: 
    constant <- which(apply(data, 2, function(u) {min(u, ...)==max(u, ...)})) 
    if(is.vector(data)) { 
    res <- .minmax(data) 
    } else { 
    res <- apply(data, 2, .minmax) 
    } 
    res[, constant] <- 0.5 
    return(res) 
} 

# MAIN function 
colstr = function(input, size.max=500, export=FALSE) { 
    data  <- as.data.frame(input) 
    if (NCOL(data) == 1) { 
    data <- cbind(data, data) 
    message("warning: input data is a vector") 
    } 
    miror  <- data # miror data.frame will contain a coulour coding for all cells 
    wholeNA <- which(sapply(miror, function(x) all(is.na(x)))) 
    whole0 <- which(sapply(miror, function(x) all(x==0))) 
    numeric <- which(sapply(data, is.numeric)) 
    character <- which(sapply(data, is.character)) 
    factor <- which(sapply(data, is.factor)) 
    # characters to code 
    miror[character] <- 12 
    # factor coding 
    miror[factor] <- 11 
    # min/max normalization, coerce it into 9 classes. 
    if (!is.empty(numeric)) {miror[numeric] <- minmax(miror[numeric], na.rm=T)} 
    miror[numeric] <- data.frame(lapply(miror[numeric], function(x) cut(x, breaks=9, labels=1:9))) # 9 classes numériques 
    miror <- data.frame(lapply(miror, as.numeric)) 
    # Na coding 
    miror[is.na(data)] <- 10 
    miror[whole0] <- 13 
    # color palette vector 
    mypalette <- c(brewer.pal(n=9, name="Blues"), "red", "green", "purple", "grey") 
    colnames <- c(paste0((1:9)*10, "%"), "NA", "factor (lvls)", "character", "zero") 
    # subset if too large 
    couper <- nrow(miror) > size.max 
    if (couper) miror <- head(miror, size.max) 
    # plot 
    g <- ggplot(data=melt(as.matrix(unname(miror)))) + 
    geom_tile(aes(x=Var2, y=Var1, fill=factor(value, levels=1:13))) + 
    scale_fill_manual("legend", values=mypalette, labels=colnames, drop=FALSE) + 
    ggtitle(paste("graphical structure of", deparse(substitute(input)), paste(dim(input), collapse="X"), ifelse(couper, "(truncated)", ""))) + 
    xlab("columns of the dataframe") + ylab("rows of the dataframe") + 
    geom_point(data=data.frame(x=0, y=1:NROW(input)), aes(x,y), alpha=1-all(row.names(input)==seq(1, NROW(input)))) + 
    scale_y_reverse(limits=c(min(size.max, nrow(miror)), 0)) 
    if (!is.empty(factor)) { 
    g <- g + geom_text(data=data.frame(x  = factor, 
             y  = round(runif(length(factor), 2, NROW(miror)-2)), 
             label = paste0("(", sapply(data[factor], function(x) length(levels(x))), ")")), 
         aes(x=x, y=y, label=label)) 
    } 
    if (export) {png("colstr_output.png"); print(g); dev.off()} 
    return(g) 
} 
2

Hai incontrato il CSV fingerprint service? Crea un'immagine simile, anche se non con tutti i dettagli che hai delineato sopra, e non è basato su R. Esiste una versione R di un'idea simile a R-ohjelmointi.org, ma il testo è in finlandese. La funzione principale è csvSormenjalki(). Forse potrebbe essere adattato ulteriormente per soddisfare la tua intera visione?

+0

infatti, è uno strumento piacevole che non conoscevo, grazie. Suppongo che la sfida sia adattarla a R, come dici tu – agenis

4

So che c'è un pacchetto che mostra i valori mancanti facilmente, ma il mio google-fu non è molto buono al momento. Ho trovato, tuttavia, una funzione chiamata tableplot, che ti darà una grande panoramica del tuo data frame. Non so se ti mostrerà o meno i dati mancanti.

ecco il link:

http://www.ancienteco.com/2012/05/quickly-visualize-your-whole-dataset.html

+0

appena testato, lavoro davvero bello qui; tuttavia potrebbe essere un po 'più "a valle" nel processo di analisi esplorativa, poiché ordina i dati e modifica la struttura per visualizzare già gli istogrammi. +1 – agenis

+0

library (DescTools) ora ha una funzione per questo: PlotMiss – Henk

2

È possibile provare visdat pacchetto (https://github.com/ropensci/visdat), che mostra i valori NA ei tipi di dati nella trama

install.packages("visdat") 
library(visdat) 
vis_dat(airquality) 
+0

grazie per la risposta, bel pacchetto e l'output è abbastanza pulito, è recente? – agenis