2012-03-25 7 views
2

현재 간단한 전류 - 전압 실험 결과를 시각화하기 위해 ggplot2를 사용하려고합니다. 물론 한 세트의 데이터에 대해 좋은 결과를 얻을 수있었습니다.ggplot2의 물리 실험 데이터 정리

그러나, 나는 (최소한의 코드를 참조) 재귀 적으로 다음과 같은 조직을 얻기 위해 R에서 I 입력 전류 - 전압 데이터 세트의 번호를 가지고 :

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) 

더 많은 일반 버전이 될 것이다는 (다이아몬드, 자동차 등) 통계 자료 이산 반대로, 원시 물리적 데이터를 handeling의 ggplot2 수있다?

+1

"반복적으로 R에 데이터를 inputing"귀하의 설명입니다 매우 불분명하다. 또한 "통계 데이터"와 "원시 물리적 데이터"사이의 구분이 무엇인지 분명하지 않습니다. 데이터는 데이터입니다. 제대로 구성하는 것은 당신에게 달려 있습니다. 아마도 여기의 가이드 라인 [here] (http://stackoverflow.com/q/5963269/324364)에 따라 구체적이고 재현 가능한 예제를 제공해야합니다. – joran

+0

목록을 data.frame 형식으로 가져 오려고합니다. data.frame (batch = your.list [1], sample = your.list [2], your.list [3])으로이 작업을 수행 할 수 있습니다. 몇 가지 길 : do (your.list, rbind), reshape, ... –

+0

귀하의 의견을 보내 주셔서 감사합니다, 그것은 단지 내 머리를 녹여 ggplot2 주위에 포장의 문제입니다 확신합니다. 그러나 나는 각 ggplot2 다이아몬드와 자동차 예제를 살펴 보았고 연결 변수를 사용하여 아무 것도 발견하지 못했습니다 (전류 값과 전압 값이 같음). 그러므로 내 질문. 나는 조란의 말에 더 많은 것을 추가했다. 다시 한번 감사드립니다. –

답변

1

, 나는 다음과 같은 전략 제안 :

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

이것은 내가 검색 한 것과 같습니다. 아주 깔끔한 느낌. 다시 감사합니다 ! 나는 오늘이 책을 열어두고 somone이 더 많은 것을 제안하고 내가 권리가있을 때 투표 할 수 있는지 알아볼 것입니다. –

+0

나는 이제 너에게 +1 할 자격이있다. :) –

1

샘플 이름이 데이터 세트와 관련하여 어떻게 정의되는지는 명확하지 않습니다. ggplot2의 일반적인 아이디어는 모든 데이터를 녹아 (긴 형식의) data.frame 형식으로 그룹화해야한다는 것입니다. 새로 정의 문제 ("batchname_samplenumber.txt"라는 두 개의 열 파일)와

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

답변 해 주셔서 감사합니다. 당신은 내가 편집 한 나의 질문에서 분명하지는 않지만, 내가 그린 그림을 아주 정확하게 이해할 수있었습니다. 현재 내 사례에 코드를 적용하려고합니다. –