Организация данных из физических экспериментов для ggplot2 - PullRequest
2 голосов
/ 26 марта 2012

В настоящее время я пытаюсь использовать ggplot2 для визуализации результатов простых экспериментов по току и напряжению. Мне удалось добиться хороших результатов для одного набора данных, конечно.

Однако у меня есть несколько наборов данных о напряжении тока, которые я рекурсивно ввожу в R, чтобы получить следующую организацию (см. Минимальный код):

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

Редактировать: мои данные хранятся в текстовых файлах с именами batchname_samplenumber.txt, со столбцами напряжения и тока. Код, который я использую для их импорта:

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

И минимальные данные могут быть получены с помощью:

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

У меня вопрос: можно ли использовать данные как есть для построения графика, используя код, подобный следующему (что не работает)?

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

Более общей версией было бы: способен ли ggplot2 обрабатывать необработанные физические данные, в отличие от дискретных статистических данных (таких как алмазы, автомобили)?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

В связи с недавно определенной проблемой (файлы из двух столбцов с именем "batchname_samplenumber.txt") я бы предложил следующую стратегию:

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)
1 голос
/ 26 марта 2012

Непонятно, как имена образцов определяются по отношению к набору данных.Общая идея ggplot2 заключается в том, что вы должны сгруппировать все свои данные в виде расплавленного (длинного формата) data.frame.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...