2012-03-02 43 views
1

我有一个数据帧,其是样品ID号码,然后井位置的第一列,像这样的独特组合:将数据插入到数据帧中基于两个因素

>df[1:12,1:10] 

S W V3 V4 
SID1 A01 <NA> <NA> 
SID2 A02 <NA> <NA> 
SID3 A03 <NA> <NA> 
SID4 A01 <NA> <NA> 
SID5 A02 <NA> <NA> 
SID5 A03 <NA> <NA> 

组合的S和W列是独一无二的,并且必须保持如此,因为一些样品具有重复测量,但对于下游分析原因(不在R中)不能像通常那样放置在同一行上。

我希望根据这两列的唯一组合将数据插入数据框。

我想插入的数据是从另一个数据帧,看起来像这样:

>results[1:12, 1:4] 

SampleID Value Assay   Well 
SID1  0  V3  A01 
SID1  0  V4  A01 
SID2  1  V3  A02 
SID2  2  V4  A02 
SID3  0  V3  A03 
SID3  1  V4  A03 
SID4  0  V3  A01 
SID4  0  V4  A01 
SID5  1  V3  A02 
SID5  2  V4  A02 
SID6  0  V3  A03 
SID6  1  V4  A03 

所以目前我通过列(V3和V4循环,也有真实的数据约1000列设置),并根据样本ID,孔位置和化验的独特组合,逐个插入数据。这很慢。我想通过插入所有V3的值来加快矢量化速度,这取决于样本ID和井号。

我试图

for(i in levels(result$Assay)) 
{ 
    df$V3[(df$V1 %in% results$SampleID)&(df$V2 %in% results$Well] 
    = results$Value[results$Assay==i] 
} 

这对我不起作用。我想象因为我的一些愚蠢!
任何想法?

编辑:
其实,本的解决方案几乎工作。一开始一切都很好,但是因为测试分布在n个文件上,并且当合并试图通过测试将它加入到df中时将样本分散在y文件中,它添加了一个新列并添加一个“.1”结束。

准确地说你期望合并做我想。我的错是因为没有解释我的数据来自不同的文件。

来说明:

我有16个文件。共有1536个样本分布在4个文件中,每个文件384个。有160个独立的测定,分布在4个测定包中。为了运行每个样品的每个分析,我最终得到16个文件。

所以如果我可以合并不添加一个新的列,如果当前化验的列已经存在,那将是完美的。

欢迎您提出所有建议,
对于在解释我的数据时发生垃圾而感到抱歉!

干杯
戴维

+0

你说真实数据有1000列,但你说有160个独立的分析。我认为在最终结果中列=测定(160),行=样品ID *孔(1536)? – 2012-03-03 01:50:41

回答

3

让我们假设你有一个文件名在一个载体datafiles这样的文件1-4样品1-384的所有试验数据,5-8样品385所有检测-768等等,并且您希望以1536行x 162列的数据框结束。

library(reshape) 
## read all files into a list of data frames: 
alldata <- lapply(datafiles,read.table) 

分成四个组块:

splitdata <- split(alldata,rep(1:4,each=4)) 

的函数采取的n数据集的列表,每个都包含来自k个体(m测定即每一个都是k*m行乘4列:SampleIDWell,Assay,Value),并将它们组合成单个数据集,即kn*m+2列长:

mergefun <- function(X) { 
    cdata <- lapply(X, 
        cast, 
        formula=SampleID+Well~Assay, 
        value="Value") 
    ## produces data sets of the form 
    ## SampleID Well V3 V4 
    ## 1  SID1 A01 0 0 
    ## 2  SID2 A02 1 2 
    ## ... 
    Reduce(cdata,merge) 
} 

现在申请这对每个块:

merged_data <- lapply(splitdata,mergefun) 

下面结合大块:

final <- do.call(rbind,merged_data) 

我不知道这会工作,但它可能。如果第一次尝试不起作用,你应该拆开它们,分别检查他们做了什么 - 我可能在某个地方搞砸了。

+0

谢谢!不敢相信我没有想到这一点。 R让我感到很蠢。 这大部分工作。尽管如此,仍然需要循环使用不同的Assay值。并且需要使用all.x = T来保存x中的行数。太感谢了。 – 2012-03-02 23:33:22

+0

嗨, 对不起1000列,以后会出现很多。我被混淆了(再一次,对不起这个垃圾!) 你的代码几乎完美工作。最后一行发生错误。我试图试图解决问题,但我认为这需要一个新的问题。如果我不能克服它,我会把它放在可重现的问题上。再次感谢你的帮助。如果只有一个+ 1e6按钮。传说!!! – 2012-03-03 04:55:15

相关问题