2014-12-18 10 views
11

Ich möchte die Struktur eines Datenrahmens (oder Matrix oder data.table was auch immer) auf einem einzigen Diagramm mit Farbcodierung darstellen. Ich denke, das könnte für viele Leute, die mit verschiedenen Arten von Daten umgehen, sehr nützlich sein, um sie auf einen Blick zu visualisieren.visuelle Struktur eines data.frame: Standorte von NAs und vieles mehr

Vielleicht hat jemand schon ein Paket dafür entwickelt, aber ich konnte keins finden (nur this). Also hier ist eine grobe Mockup meiner „Vision“, eine Art einer Heatmap, zeigt in Farbcodes:

  • die NA Orten
  • die Klasse von Variablen (Faktoren (wie viele Ebenen), numerisch (mit Farbverlauf, Nullen, Ausreißer ...), strings)
  • Abmessungen
  • etc .....

enter image description here

S o Bis jetzt habe ich geschrieben, eine Funktion, die NA Standorte plotten es so geht:

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) 
} 

in jedem data.frame in Eingabe nimmt und gibt dieses Bild:

enter image description here

Es ist zu groß eine Herausforderung für mich, das erste Bild zu erreichen.

+0

das rdataviewer Paket zeigt könnte einen nützlichen Ausgangspunkt bieten – baptiste

+1

Ein verwandter SO-Post ist aufgetaucht und könnte von Interesse sein: [Lücken und Leerstellen untersuchen und visualisieren in großen Datenrahmen] (http: // stackover flow.com/q/28813057/2727349) – swihart

Antwort

2

schließlich ich mit einem Skript kommen die meisten der Spezifikationen plotten. Ich gebe es hier ein, einige könnten daran interessiert sein, obwohl die Syntax weit davon entfernt ist, "elegant" zu sein!

anzumerken, dass die Hauptfunktion ‚colstr‘ 3 Argumente hat: - einen Eingang (df oder Matrix oder sogar einzelne Vektor) - eine maximale Zeilenzahl plotten - eine Option in PNG in das Arbeitsverzeichnis zu exportieren.

der Ausgang gibt, zum Beispiel: 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

Haben Sie die CSV fingerprint service angetroffen? Es erzeugt ein ähnliches Bild, wenn auch nicht mit allen Details, die Sie oben skizziert haben, und es basiert nicht auf R. Es gibt eine R-Version einer ähnlichen Idee unter R-ohjelmointi.org, aber der Text ist in Finnisch. Die Hauptfunktion ist csvSormenjalki(). Vielleicht könnte das weiter angepasst werden, um Ihre ganze Vision zu erfüllen?

+0

In der Tat, es ist ein nettes Werkzeug, das ich nicht kannte, danke. Ich schätze, die Herausforderung besteht darin, sie an R anzupassen, wie Sie sagen, – agenis

4

Ich weiß, dass es ein Paket gibt, das fehlende Werte leicht anzeigt, aber mein Google-Fu ist im Moment nicht sehr gut. Ich habe jedoch eine Funktion namens tableplot gefunden, die Ihnen einen großartigen Überblick über Ihren Datenrahmen geben wird. Ich weiß nicht, ob es Ihnen fehlende Daten zeigen wird oder nicht.

Hier ist der Link:

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

+0

haben es gerade getestet, wirklich nette Arbeit hier; Dennoch könnte es im explorativen Analyseprozess etwas "nachgelagerter" sein, da es die Daten sortiert und die Struktur ändert, um bereits Histogramme anzuzeigen. +1 – agenis

+0

Bibliothek (DescTools) hat jetzt eine Funktion dafür: PlotMiss – Henk

2

Sie können visdat Paket ausprobieren (https://github.com/ropensci/visdat), die die NA-Werte und Datentypen in der Handlung

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

danke für die Antwort, schönes Paket und die Ausgabe ist ganz ordentlich, ist es neueren Datums? – agenis

Verwandte Themen