R-将单元格与另一个单元格匹配以检索不同行的值

时间:2017-06-15 17:49:34

标签: r dataframe

我有一个数据表,其中Filename列的每个值在Compound列中都有一组值。某些化合物值具有与另一个化合物匹配的IS值。我需要将IS中的值与Compound列匹配,从该行检索Chrom.1.RT的值,然后将该值放在IS值所在行的IS_RT列中。

示例:

Filename    Compound    Chrom.1.RT  IS  IS_RT

1_04        Amp_d6      2.93075     0   0
1_04        Bup_d4      7.280333    0   0
1_04        Cocaine_d3  5.66195     0   0
1_04        10-monohyd  0           Cocaine_d3  5.66195
1_04        2-hydroxy   0           Bup_d4  0
1_04        6-MAM       3.566433    Amp_d6  0
1_05        Amp_d6      2.94        0   0
1_05        Bup_d4      7.3         0   0
1_05        Cocaine_d3  5.65        0   0
1_05        10-monohyd  0           Cocaine_d3  5.65
1_05        2-hydroxy   0           Bup_d4  0
1_05        6-MAM       3.6         Amp_d6  0

10-monohyd的线条显示了我想要做的事情。我不确定从哪里开始。在此先感谢您的帮助!

编辑:

我尝试过的代码似乎不起作用:

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[SampleRows], RefRows$Compound)] 

}

3 个答案:

答案 0 :(得分:0)

我不得不承认我对自己的理解并不太自信,但这是基于我最好的解释而得到的。

重新创建数据 * 请在将来使用dput *

stri_split_lines1('Filename    Compound    Chrom.1.RT  IS  IS_RT

1_04        Amp_d6      2.93075     0   0
1_04        Bup_d4      7.280333    0   0
1_04        Cocaine_d3  5.66195     0   0
1_04        10-monohyd  0           Cocaine_d3  5.66195
1_04        2-hydroxy   0           Bup_d4  0
1_04        6-MAM       3.566433    Amp_d6  0
1_05        Amp_d6      2.94        0   0
1_05        Bup_d4      7.3         0   0
1_05        Cocaine_d3  5.65        0   0
1_05        10-monohyd  0           Cocaine_d3  5.65
1_05        2-hydroxy   0           Bup_d4  0
1_05        6-MAM       3.6         Amp_d6  0') %>% {
    a <- stri_split_regex(., '\\s+', simplify = T)
    cl <- a[1,]
    setNames(as.data.frame(a[c(-1,-2),]),cl)
} -> a_d_f

因此,我似乎在目标中迭代记录,如果记录在IS列中有值,则将该值与Compound列中的位置匹配,并对于该行获取相应的Chrom.1.RT值并放入最初感兴趣记录的IS_RT列。但是有一堆对我来说没有逻辑意义;所以这是一个起点:

  
      
  1. 逐行遍历数据框
  2.   
  3. 将该行作为数据框分配给dv
  4.   
  5. 如果dv的{​​{1}}列不是IS,请在master data.frame中找到该单元格中的值,然后在中查找该行的值   ORIGINAL data.frame。使用max-distance作为确定方式   要使用哪个值,因为有多种可能性。
  6.   
  7. 将其分配给0
  8. 的单元格   
  9. 返回
  10.   
  11. 绑定到一个data.frame。
  12.   
IS_RT

答案 1 :(得分:0)

matched_compounds <- merge(
  df1[, c('Filename', 'IS', 'IS_RT')],
  df1[, c('Filename', 'Compound', 'Chrom.1.RT')],
  by.x = c('Filename', 'IS'),
  by.y = c('Filename', 'Compound'),
  all.x = TRUE
)
df1$IS_RT <- matched_compounds$Chrom.1.RT

答案 2 :(得分:0)

这是最终起作用的。它似乎有点笨重,但它给了我正确的输出我需要的。 :

# Add IS_RT column
df1$IS_RT<- 0

#Get a list of the unique filename values

SampleList <- unique(df1$Filename)

# Make two tables to use as a references, and loop through the list of     unique filenames

for (i in 1:length(SampleList)) {
  foo <- subset(df1, Filename == SampleList[i])
  Reference <- foo
  foo$IS_RT <- Reference$Chrom.1.RT[ match(foo$IS,Reference$Compound)]
  SampleRows <- which(df1$Filename == SampleList[i])
  df1$IS_RT[SampleRows] <- Reference$Chrom.1.RT[match(foo$IS,Reference$Compound)]
}