循环数据框并根据公共列绘制时间序列

时间:2015-04-21 20:24:43

标签: r plot

所以我有一个数据帧,它有两个读数(组成数据)的Plate ID,Time Point,Substrate和Mean Values:

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

每个Plate_ID有32个底物,每个平板有7天读数。

理想情况下,我想绘制10天内相同时间序列的590和750平均值(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

但是,我想知道是否有办法循环数据并根据数据创建这些图像。

1 个答案:

答案 0 :(得分: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和{{1}将原始数据拆分为数据框列表,而不是使用索引进行愚弄。 }:

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

给我

enter image description here