2012-03-25 10 views
2

Ich versuche derzeit, ggplot2 zu verwenden, um Ergebnisse von einfachen Strom-Spannungsexperimenten zu visualisieren. Ich habe natürlich gute Ergebnisse für eine Datenmenge erzielt.Organisieren von Daten aus Physikexperimenten für ggplot2

Allerdings habe ich eine Reihe von Strom-Spannungs-Datensätzen, die ich Eingang in R rekursiv die folgende Organisation zu erhalten (minimal Code):

data.frame(cbind(batch(string list), sample(string list), dataset(data.frame list))) 

Edit: Meine Daten werden in Textdateien Namen gespeichert batchname_sampelnummer.txt, mit Spannungs- und Stromspalten. Der Code, den ich zu importieren verwenden, um sie ist:

require(plyr) 
require(ggplot2) 

#VARIABLES 
regex <- "([[:alnum:]_]+).([[:alpha:]]+)" 
regex2 <- "G5_([[:alnum:]]+)_([[:alnum:]]+).([[:alpha:]]+)" 

#FUNCTIONS 
getJ <- function(list, k) llply(list, function(i) llply(i, function(i, indix) getElement(i,indix), indix = k)) 

#FILES 
files <- list.files("Data/",full.names= T) 

#NAMES FOR FILES 
paths <- llply(llply(files, basename),function(i) regmatches(i,regexec(regex,i))) 
paths2 <- llply(llply(files, basename),function(i) regmatches(i,regexec(regex2,i))) 
names <- llply(llply(getJ(paths, 2)),unlist) 
batches <- llply(llply(getJ(paths2, 2)),unlist) 
samples <- llply(llply(getJ(paths2, 3)),unlist) 

#SETS OF DATA, NAMED 
sets <- llply(files,function(i) read.table(i,skip = 0, header = F)) 
names(sets) <- names 
for (i in as.list(names)) names(sets[[i]]) <- c("voltage","current") 

df<-data.frame(cbind(batches,samples,sets))  

und ein minimalen Daten können über generiert werden:

require(plyr) 

batch <- list("A","A","B","B") 
sample <- list(1,2,1,2) 
set <- list(data.frame(voltage = runif(10), current = runif(10)),data.frame(voltage = runif(10), current = runif(10)),data.frame(voltage = runif(10), current = runif(10)),data.frame(voltage = runif(10), current = runif(10))) 

df<-data.frame(cbind(batch,sample,set)) 

Meine Frage ist: ist es möglich, die Daten zu verwenden, wie einen Code zum Plotten mit ähnlich wie folgt (was nicht funktioniert)?

ggplot(data, aes(x = dataset$current, y = dataset$voltage, colour = sample)) + facet_wrap(~batch) 

Die allgemeinere Version wäre: ist ggplot2 Lage rohe physikalische Daten von handeling, statistischen Daten diskreten, im Gegensatz (wie Diamanten, Autos)?

+1

Ihre Beschreibung von „Daten in R rekursiv inputing“ ist sehr unklar. Außerdem ist nicht klar, was die Unterscheidung zwischen "statistischen Daten" und "physikalischen Rohdaten" sein könnte. Daten sind Daten. Es liegt an Ihnen, sich richtig zu organisieren. Sie sollten vielleicht ein konkretes, reproduzierbares Beispiel geben, das den Richtlinien [hier] folgt (http://stackoverflow.com/q/5963269/324364). – joran

+0

Sie möchten Ihre Liste wahrscheinlich in ein dat.frame-Format konvertieren. Dies können Sie möglicherweise mit data.frame tun (batch = your.list [1], sample = your.list [2], your.list [3]). Ein paar Wege: do (your.list, rbind), umgestalten, ... –

+0

Danke für Ihre Kommentare, ich bin mir sicher, es ist nur eine Frage des Umschlingens um Schmelze und ggplot2. Allerdings habe ich mir jedes ggplot2 Diamanten und Autos Beispiele angeschaut und nichts gefunden mit verknüpften Variablen (wie ein Wert von Strom geht mit einem Wert von Spannung). Daher meine Frage. Ich fügte weitere Details hinzu, im Anschluss an Joran Kommentar. Danke noch einmal. –

Antwort

1

Mit den neu definierten Problem (zweispaltige Dateien mit dem Namen „batchname_samplenumber.txt“), würde ich die folgende Strategie vorschlagen:

read_custom <- function(f, ...) { 
d <- read.table(f, ...) 
names(d) <- c("V", "I") 
## extract sample and batch from the base filename 
ids <- strsplit(gsub(".txt", "", f), "_") 
d$batch <- ids[[1]][1] 
d$sample <- ids[[1]][2] 
d 
} 

## list files to read 
files <- list.files(pattern=".txt") 
## read them all in a single data.frame 
m <- ldply(files, read_custom) 
+0

Das sieht aus wie ich gesucht habe. Es fühlt sich sehr gepflegt an. Danke nochmal ! Ich werde das heute offen lassen, um zu sehen, ob irgendjemand etwas mehr vorschlägt und ich stimme, wenn ich das Recht dazu habe. –

+0

Ich kann dir jetzt die +1 geben, die du verdienst :) –

1

Es ist nicht klar, wie die Beispielnamen in Bezug auf den Datensatz definiert sind. Die allgemeine Idee für ggplot2 ist, dass Sie alle Ihre Daten in Form eines geschmolzenen (langen) Datenrahmens gruppieren sollten.

library(ggplot2) 
library(plyr) 
library(reshape2) 

l1 <- list(batch="b1", sample=paste("s", 1:4, sep=""), 
      dataset=data.frame(current=rnorm(10*4), voltage=rnorm(10*4))) 
l2 <- list(batch="b2", sample=paste("s", 1:4, sep=""), 
      dataset=data.frame(current=rnorm(10*4), voltage=rnorm(10*4))) 
l3 <- list(batch="b3", sample=paste("s", 1:4, sep=""), 
      dataset=data.frame(current=rnorm(10*4), voltage=rnorm(10*4))) 

list_to_df <- function(l, n=10){ 

    m <- l[["dataset"]] 
    m$batch <- l[["batch"]] 
    m$sample <- rep(l[["sample"]], each=n) 
    m 
} 

## list_to_df(l1) 

m <- ldply(list(l1, l2, l3), list_to_df) 

ggplot(m) + facet_wrap(~batch)+ 
    geom_path(aes(current, voltage, colour=sample)) 
+0

Vielen Dank für Ihre Antwort. Sie haben ziemlich genau verstanden, was ich mir vorgestellt habe, obwohl ich in meiner Frage (die jetzt bearbeitet wird) nicht so klar war. Ich versuche gerade, meinen Code an meinen Fall anzupassen. –

Verwandte Themen