繁体   English   中英

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

[英]Inserting data into a data frame based on the unique combination of two factors

我有一个数据框,其第一列是样本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个文件。

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

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

干杯
戴维

假设您在矢量datafiles文件中有文件名,文件1-4是样本1-384的所有分析的数据,样本385-768的所有分析的5-8,等等,并且您想要最终得到一个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数据集的列表,每个数据集包含来自k个体的m测定(即每个数据是k*m行×4列: SampleIDWellAssayValue )并将它们组合成单个数据集,即k行长为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)

现在组合块:

final <- do.call(rbind,merged_data)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM