R:需要为数据框中的每一行执行多个匹配

时间:2016-04-27 18:39:15

标签: r dataframe

我有一个数据框,对于每个Filename值,Compound有一组值。某些化合物具有IS.Name的值,该值是Filename的Compound值之一。

,Batch,Index,Filename,Sample.Name,Compound,Chrom.1.Name,Chrom.1.RT,IS.Name,IS.RT
1,Batch1,1,Batch1-001,Sample001,Compound1,1,0.639883333,IS-1,0
2,Batch1,1,Batch1-001,Sample001,IS-1,IS1,0.61,NONE,0

对于我的数据框中具有相同Filename值的每组行,我想将IS.Name值与相应的Compound值匹配,并将匹配行中的Chrom.1.RT值放入IS中。 RT细胞。例如,在上表中,我想从第2行的Compound = IS-1获取Chrom.1.RT值,并将其放入第1行的IS.RT中,如下所示:

,Batch,Index,Filename,Sample.Name,Compound,Chrom.1.Name,Chrom.1.RT,IS.Name,IS.RT
1,Batch1,1,Batch1-001,Sample001,Compound1,1,0.639883333,IS-1,0.61
2,Batch1,1,Batch1-001,Sample001,IS-1,IS1,0.61,NONE,0

如果可能的话,我需要在R中这样做。先谢谢你的帮助!

编辑:这是一个更大,更详细的例子:

    Filename    Compound    Chrom.1.RT  IS.Name IS.RT
1   Sample-001  IS-1    1.32495 NONE    NA
2   Sample-001  Compound-1  1.344033333 IS-1    NA
3   Sample-001  IS-2    0.127416667 NONE    NA
4   Sample-001  Compound-2  0   IS-2    NA
5   Sample-002  IS-1    1.32495 NONE    NA
6   Sample-002  Compound-1  1.344033333 IS-1    NA
7   Sample-002  IS-2    0.127416667 NONE    NA
8   Sample-002  Compound-2  0   IS-2    NA

这是色谱数据。对于每个样品,正在分析四种化合物,并且每种化合物具有保留时间值(Chrom.1.RT)。这些化合物中的两种是其他两种化合物使用的参考物。例如,化合物-1使用IS-1,而IS-1不具有参考(IS)。在每个样本中,我试图将IS名称与复合行匹配,以便获取CHrom.1.RT并将其放入IS.RT字段中。因此,对于Compound-1,我想找到化合物的Chrom.1.RT值,其名称与IS.Name字段(IS-1)相同,并将其放入Compound-1的IS.RT字段中。我正在使用的表格将所有化合物列在一起并且不匹配参考文献的值,我需要为计算Chrom.1.RT和IS之间的差异的下一步做。每种化合物的.RT。这有帮助吗?

编辑 - 我发现的代码似乎有效:

sampleList<- unique(df1$Filename)
for (i in sampleList){
   SampleRows<-which(df1$Filename == sampleList[i])
   RefRows <- subset(df1, Filename== sampleList[i])
   df1$IS.RT[SampleRows]<- RefRows$Chrom.1.RT[ match(df1$IS.Name[SampleRows], RefRows$Compound)] 
    }

我绝对愿意接受任何建议,以提高效率。

1 个答案:

答案 0 :(得分:0)

首先,我建议你将来提供你的例子作为dput(df1)的输出,因为它可以更容易地将它读入R而不是你提供的空格分隔表

话虽这么说,我已经设法用MS Excel的“帮助”将它与R纠缠在一起。

df1=structure(list(Filename = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L), .Label = c("Sample-001", "Sample-002"), class = "factor"), 
Compound = structure(c(3L, 1L, 4L, 2L, 3L, 1L, 4L, 2L), .Label = c("Compound-1", 
"Compound-2", "IS-1", "IS-2"), class = "factor"), Chrom.1.RT = c(1.32495, 
1.344033333, 0.127416667, 0, 1.32495, 1.344033333, 0.127416667, 
0), IS.Name = structure(c(3L, 1L, 3L, 2L, 3L, 1L, 3L, 2L), .Label = c("IS-1", 
"IS-2", "NONE"), class = "factor"), IS.RT = c(NA, NA, NA, 
NA, NA, NA, NA, NA)), .Names = c("Filename", "Compound", 
"Chrom.1.RT", "IS.Name", "IS.RT"), class = "data.frame", row.names = c(NA, 
-8L))

下面的代码非常笨重,但它可以完成这项工作。

library("dplyr")
df1=tbl_df(df1)
left_join(df1,left_join(df1%>%select(-Compound),df1%>%group_by(Compound)%>%summarise(unique(Chrom.1.RT)),c("IS.Name"="Compound")))%>%select(-IS.RT)%>%rename(IS.RT=`unique(Chrom.1.RT)`)

除非我弄错了,这就是你需要的东西?