我有一个数据框,对于每个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)]
}
我绝对愿意接受任何建议,以提高效率。
答案 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)`)
除非我弄错了,这就是你需要的东西?