2015-04-21 7 views
0

Так что я dataframe, который имеет пластины ID, момент времени, а также основания, и средние значения для двух измерений (составлявшие данные):Перебор dataframe и временных рядов участка на основе общего столбца

Plate_ID Day Name   590_Mean 590_SD 750_Mean 750_Mean 
MCBA15 001 0  Cyclodextrin 0.217  0.012  0.161  0.012 
MCBA15 001 1  Cyclodextrin 0.257  0.012  0.171  0.012 
MCBA15 001 3  Cyclodextrin 0.217  0.012  0.161  0.012 
... 
MCBA15 001 10  Cyclodextrin 0.217  0.012  0.161  0.012 
MCBA15 005 0  Cyclodextrin 0.217  0.012  0.161  0.012 
MCBA15 005 1  Cyclodextrin 0.257  0.012  0.171  0.012 
MCBA15 005 3  Cyclodextrin 0.217  0.012  0.161  0.012 
... 
MCBA15 005 10  Cyclodextrin 0.217  0.012  0.161  0.012 
MCBA15 001 0  Lactose  0.217  0.012  0.161  0.012 
MCBA15 001 1  Lactose  0.257  0.012  0.171  0.012 
MCBA15 001 3  Lactose  0.217  0.012  0.161  0.012 
... 
MCBA15 001 10  Lactose  0.217  0.012  0.161  0.012 
MCBA15 005 0  Lactose  0.217  0.012  0.161  0.012 
MCBA15 005 1  Lactose  0.257  0.012  0.171  0.012 
MCBA15 005 3  Lactose  0.217  0.012  0.161  0.012 
... 
MCBA15 005 10  Lactose  0.217  0.012  0.161  0.012 

Там 32 подложки на Plate_ID, и каждая пластина имеет 7-дневные показания.

В идеале, я хочу построить средние значения 590 и 750 в тех же временных рядах за 10-дневный период (7 показаний) со стандартными отклонением (временные интервалы = 1 день).

Мне удалось создать один такой график, но это происходило и сортировка данных. Затем я принял следующий подход:

library('Hmisc') 

x <- sortbiolog$Day[1:7] 
y <- sortbiolog$X750_Mean[1:7] 
sd <- sortbiolog$X750_SD[1:7] 

plot(x, y, type = "b", ylim = c(0,.3)) 
with(
    data = sortbiolog, 
    expr = errbar(x, y, y + sd, y - sd, add = T, pch =1, cap = .01), main = "?-Cyclodextrin Substrate for MCBA15 001") 

par(new=TRUE) 

a <- sortbiolog$Day[1:7] 
b <- sortbiolog$X590_Mean[1:7] 
ab_sd <- sortbiolog$X590_SD[1:7] 

plot(a, b, type = "b", ylim = c(0,.3)) 
with(
    data = sortbiolog, 
    expr = errbar(a, b, b + ab_sd, b - ab_sd, add = T, pch =1, cap = .01, col="red", axis=FALSE)) 

legend('topright', legend=c("Mean 750", "Mean 590"), text.col=c("black", "red")) 

enter image description here

Однако, мне было интересно, если есть способ проходным данных и создания этих изображений на основе данных.

ответ

0
dat <- read.table(header = TRUE, text="Plate_ID Day Name   590_Mean 590_SD 750_Mean 750_SD 
'MCBA15 001' 0  Cyclodextrin 0.217  0.012  0.161  0.012 
'MCBA15 001' 1  Cyclodextrin 0.257  0.012  0.171  0.012 
'MCBA15 001' 2  Cyclodextrin 0.257  0.012  0.171  0.012 
'MCBA15 001' 3  Cyclodextrin 0.217  0.012  0.161  0.012 
'MCBA15 001' 5  Cyclodextrin 0.257  0.012  0.171  0.012 
'MCBA15 001' 7  Cyclodextrin 0.257  0.012  0.171  0.012 
'MCBA15 001' 10  Cyclodextrin 0.217  0.012  0.161  0.012 
'MCBA15 005' 0  Cyclodextrin 0.217  0.012  0.161  0.012 
'MCBA15 005' 1  Cyclodextrin 0.257  0.012  0.171  0.012 
'MCBA15 005' 2  Cyclodextrin 0.257  0.012  0.171  0.012 
'MCBA15 005' 3  Cyclodextrin 0.217  0.012  0.161  0.012 
'MCBA15 005' 5  Cyclodextrin 0.257  0.012  0.171  0.012 
'MCBA15 005' 7  Cyclodextrin 0.217  0.012  0.161  0.012 
'MCBA15 005' 10  Cyclodextrin 0.217  0.012  0.161  0.012 
'MCBA15 001' 0  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 001' 1  Lactose  0.257  0.012  0.171  0.012 
'MCBA15 001' 2  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 001' 3  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 001' 5  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 001' 7  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 001' 10  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 005' 0  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 005' 1  Lactose  0.257  0.012  0.171  0.012 
'MCBA15 005' 2  Lactose  0.257  0.012  0.171  0.012 
'MCBA15 005' 3  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 005' 5  Lactose  0.257  0.012  0.171  0.012 
'MCBA15 005' 7  Lactose  0.217  0.012  0.161  0.012 
'MCBA15 005' 10  Lactose  0.217  0.012  0.161  0.012") 

Есть в этой функции несколько вещей, которые не являются необходимыми (например, индексация), но я хотел бы изменить, как мало из кода, как я мог бы показать вам общий подход. Итак, вот ваш код, завернутый в функцию, которая принимает один кадр данных.

f <- function(sortbiolog) { 
    require('Hmisc') 

    x <- sortbiolog$Day[1:7] 
    y <- sortbiolog$X750_Mean[1:7] 
    sd <- sortbiolog$X750_SD[1:7] 

    plot(x, y, type = "b", ylim = c(0,.3)) 
    with(
    data = sortbiolog, 
    expr = errbar(x, y, y + sd, y - sd, add = T, pch =1, cap = .01), main = "?-Cyclodextrin Substrate for MCBA15 001") 

    par(new=TRUE) 

    a <- sortbiolog$Day[1:7] 
    b <- sortbiolog$X590_Mean[1:7] 
    ab_sd <- sortbiolog$X590_SD[1:7] 

    plot(a, b, type = "b", ylim = c(0,.3), ann = FALSE) 
    with(
    data = sortbiolog, 
    expr = errbar(a, b, b + ab_sd, b - ab_sd, add = T, pch =1, cap = .01, col="red")) 

    legend('bottomright', legend=c("Mean 750", "Mean 590"), text.col=c("black", "red")) 
} 

Таким образом, вы можете продолжать использовать это на ваши полные данные, как f(dat[1:7, ]), но вместо того, чтобы морочить голову с индексированием, вы разделяете оригинал в список фреймов данных на основе Plate_ID и Name:

sp <- split(dat, with(dat, interaction(Plate_ID, Name))) 

sapply(sp, dim) 

#  MCBA15 001.Cyclodextrin MCBA15 005.Cyclodextrin MCBA15 001.Lactose MCBA15 005.Lactose 
# [1,]      7      7     7     7 
# [2,]      7      7     7     7 

А затем применить функцию по списку:

pdf('~/desktop/tmp.pdf') 
par(mfrow = c(2,2)) 
p <- lapply(sp, f) 
dev.off() 

дает мне

enter image description here

+0

спасибо! после некоторой незначительной настройки, я получил именно то, что искал. Это была ОГРОМНАЯ помощь! –

Смежные вопросы