根据两个因素的独特组合将数据插入数据框

时间:2012-03-02 22:21:19

标签: r dataframe

我有一个数据框,其第一列是样本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的唯一组合,井位和测定。这很慢。我希望通过基于样本id和井插入V3的所有值来将其向量化以使其更快。

我试过

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

这对我不起作用。我想是因为我有些愚蠢! 有任何想法吗?

修改
实际上,Ben的解决方案几乎无效。 Everythings起初很好,但因为Assays分布在n个文件上,并且当合并尝试将两个dfs连接到测试时,样本分散在y文件上,它已经合并到df中,它添加了一个新列并附加了一个“.1”到最后。

我想你正好想要合并。我没有解释我的数据来自不同的文件。

说明:

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

因此,如果我可以合并,如果当前检测的色谱柱已经存在,则不会添加新色谱柱,这将是完美的。

欢迎所有建议,
抱歉在解释我的数据时被废话!

干杯
戴维

1 个答案:

答案 0 :(得分:3)

假设您在文件名datafiles中有文件名,文件1-4是样本1-384的所有分析的数据,5-8样本385-768的所有分析,等等on,并且您希望最终得到1536行乘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数据集列表的函数,每个数据集包含来自m个体的k个分析(即每个k*m行为4列:{{ 1}},SampleIDWellAssay)并将它们组合成一个Valuek列长的单个数据集:

n*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)

我不确定这会有效,但可能会有效。如果第一次尝试不起作用,你应该把它们分开并检查它们分开做什么 - 我可能已经搞砸了。

相关问题