基于三层因子分类进行规范化

时间:2016-05-08 04:27:58

标签: r normalization plyr

我希望得到一些建议,以便在尝试规范化某些数据时,我是否正朝着正确的方向努力。

在我的数据集中,我有三个因子列("Cell types""Timepoint""Treatment")以及表示治疗效果的数字列。

对于给定的单元格类型,我想在给定时间点内通过Untreated子集规范化我的数字列。例如(原谅我,我不确定如何最好地在此论坛上包含样本数据......)

Raw data table

理想情况下,我会将相对于A的治疗BCUntreated标准化,并获取以下内容:

Normalized data

在MATLAB上我会用循环完成这个,但我希望我能在R中使用ddply。从我对ddply的了解是我应该能够根据我的因子列分离出我的数据框,但是我不确定如何编写一个能够识别每个子组中正确的归一化因子的函数。

任何建议都将不胜感激。

编辑:

感谢Alistaire教我如何正确发布数据。继承了部分数据集的输出输出......

dput(df2)
structure(list(Cell.Line = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L), .Label = c("CAOV3", 
"COV318", "COV362", "FUOV1", "FUOV2", "JHOS2", "JHOS4"), class = "factor"), 
    Median.RFU = c(99307, 13684, 207127, 294911, 2480000, 2510000, 
    927000, 1050000, 84074, 96132, 294911, 129310, 54001, 10595, 
    55558, 60015, 242676, 133580, 88273, 116825, 46846, 49991, 
    54442, 48590, 275237, 112631, 125685, 361313, 7330000, 139117, 
    4720000, 2640000, 13193, 154611, 2230000, 54001, 83733, 69464, 
    54663, 54886, 384009, 54663, 721000, 1100000, 13574, 51852, 
    307136, 54663, 53131, 55558), Timepoint = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 1L, 1L), .Label = c("24 hours", "4 hours"), class = "factor"), 
    Treatment = structure(c(3L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 
    5L, 4L, 2L, 1L, 3L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 
    2L, 1L, 1L, 2L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 3L, 
    1L, 2L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 3L, 1L, 2L
    ), .Label = c("Dextran Sulfate", "Fucoidan", "gCML", "Heparin Folate", 
    "Heparin Sulfate", "Hyaluronic Acid", "Poly (acrylic) Acid", 
    "Poly-L-Aspartic Acid", "Poly-L-Glutamic Acid", "Poly-L-Glutamic Acid-b-Polyethylene glycol", 
    "Sulfated B-Cyclodextrin Polymer", "Untreated"), class = "factor")), class = "data.frame", row.names = c(NA, 
-50L), .Names = c("Cell.Line", "Median.RFU", "Timepoint", "Treatment"
))

还要感谢一大堆指点我对dplyr,它帮助极大!我认为我非常接近寻找解决方案,但我正在努力正确识别标准化因素。由于未经处理的条件几乎总是具有最低的响应(变量Median.RFU),我几乎可以使用以下代码获得所需的处理

a1 <- group_by(df2, Cell.Line, Timepoint)

a2 <- mutate(a1, Normalized = Median.RFU / min(Median.RFU))

然而,这并不总是成立 - 正如您所看到的COV318细胞类型,其中未处理的值不是最小值。

现在我正在努力识别Median.RFU列中对应于&#34;未处理&#34;的值。治疗栏的行。我试图将其识别为

a1[a1$Treatment=="Untreated",2]

但看起来它将每个单元格划分为整个未处理子集并在data.frame中生成data.frame。关于如何前进的任何建议?

EDIT2:

我已经获得了现在有效的代码,但我确信这可能是一个更优雅的解决方案。我最终做的是使用arrange()函数来命令我的data.frame,以便未处理的组是group_by()子集的最后一个元素。

df2<-arrange(df,Cell.Line,Timepoint,Treatment)
a1 <- group_by(df2,Cell.Line,Timepoint)
a2 <- mutate(a1,Norm.MFI = Median.RFU / last(Median.RFU))

令人难以置信的是,我只能在几行代码中执行此操作,而不是传统上依赖于MATLAB的循环!谢谢大家的帮助,如果您认为有更好的方法,我仍然会欢迎您的建议。

0 个答案:

没有答案