【问题标题】:Pairwise Comparison of Rows in RR中行的成对比较
【发布时间】:2014-10-21 12:32:50
【问题描述】:

我有一个数据集,其中包含许多样本的许多测试结果。样本在数据集中复制。我想比较每组重复样本中的重复之间的测试结果。我认为首先通过 SampleID 拆分我的数据框可能是最简单的,这样我就有一个数据框列表,每个 SampleID 一个数据框。一个样本可能有 2、3、4 甚至 5 个重复,因此每个样本组要比较的唯一行组合的数量是不同的。我的逻辑如下所示。我想在数据框列表上运行一个函数并输出匹配结果。该函数将比较每组复制样本中唯一的 2 行集,并返回“匹配”、“不匹配”或 NA 值(如果缺少一个或两个测试值)。它还将返回在 2 个比较重复之间重叠的测试计数、匹配数和不匹配数。最后,它将包含一个列,其中将样本名称与其行号粘贴在一起,以便我知道比较了哪两个样本(例如 Sample1.1_Sample1.2)。谁能指出我正确的方向?

    #Input data structure
    data = as.data.frame(cbind(rbind("Sample1","Sample1","Sample2","Sample2","Sample2"),rbind("A","A","C","C","C"), rbind("A","T","C","C","C"), 
                 rbind("A",NA,"C","C","C"), rbind("A","A","C","C","C"), rbind("A","T","C","C",NA), rbind("A","A","C","C","C"),
                 rbind("A","A","C","C","C"), rbind("A",NA,"C","T","T"), rbind("A","A","C","C","C"), rbind("A","A","C","C","C")))

    colnames(data) = c("SampleID", "Test1","Test2","Test3","Test4","Test5","Test6","Test7","Test8","Test9","Test10")
    data 

    data.split = split(data, data$SampleID)


    ##Row comparison function
    #Input is a list of data frames. Each data frame contains results for replicates of the same sample.
    RowCompare = function(x){
      rowcount = nrow(x)
      ##ifelse(rowcount==2,
        ##compare row 1 to row 2
          ##paste sample names being compared together
          ##how many non-NA values overlap, keep value
          ##of those that overlap, how many match, keep value
          ##of those that overlap, how many do not match, keep value
      #ifelse(rowcount==3,
          ##compare row 1 to row 2
            ##paste sample names being compared together
            ##how many non-NA values overlap, keep value
            ##of those that overlap, how many match, keep value
            ##of those that overlap, how many do not match, keep value
          ##compare row 1 to row 3
            ##paste sample names being compared together
            ##how many non-NA values overlap, keep value
            ##of those that overlap, how many match, keep value
            ##of those that overlap, how many do not match, keep value
          ##compare row 2 to row 3
            ##paste sample names being compared together
            ##how many non-NA values overlap, keep value
            ##of those that overlap, how many match, keep value
            ##of those that overlap, how many do not match, keep value
      return(results)
    }

    #Output is a list of data frames - one for sample name
    out = lapply(names(data.split), function(x) RowCompare(data.split[[x]])) 

    #Row bind the list of data frames back together to one large data frame
    out.merge = do.call(rbind.data.frame, out) 
    head(out.merge)

    #Desired output
    out.merge = as.data.frame(cbind(rbind("Sample1.1_Sample1.2","Sample2.1_Sample2.2","Sample2.1_Sample2.3","Sample2.2_Sample2.3"),rbind("Match","Match","Match","Match"), 
                      rbind("Mismatch","Match","Match","Match"), rbind(NA,"Match","Match","Match"), rbind("Match","Match","Match","Match"), rbind("Mismatch","Match",NA,NA), 
                      rbind("Match","Match","Match","Match"), rbind("Match","Match","Match","Match"), rbind(NA,"Mismatch","Mismatch","Match"), rbind("Match","Match","Match","Match"), 
                      rbind("Match","Match","Match","Match"), rbind(8,10,9,9), rbind(6,9,8,8), rbind(2,1,1,1)))

    colnames(out.merge) = c("SampleID", "Test1","Test2","Test3","Test4","Test5","Test6","Test7","Test8","Test9","Test10", "Num_Overlap", "Num_Match","Num_Mismatch")
    out.merge

我在另一篇文章中看到的我认为可能有用的一件事是,下面的行将创建一个包含唯一行组合的数据框,然后可以使用该数据框来定义要在每组复制样本中比较哪些行。不知道如何实现它。

    t(combn(nrow(data),2))

谢谢。

【问题讨论】:

    标签: r comparison


    【解决方案1】:

    您与t(combn(nrow(data),2)) 走在正确的轨道上。请参阅下文了解我将如何做到这一点。

    testCols <- which(grepl("^Test\\d+",colnames(data)))
    
    TestsCompare=function(x,y){
      ##how many non-NA values overlap
      overlaps <- sum(!is.na(x) & !is.na(y))
      ##of those that overlap, how many match
      matches <- sum(x==y, na.rm=T)
      ##of those that overlap, how many do not match
      non_matches <- overlaps - matches # complement of matches
      c(overlaps,matches,non_matches)
    }
    
    RowCompare= function(x){
      comp <- NULL
      pairs <- t(combn(nrow(x),2))
      for(i in 1:nrow(pairs)){
        row_a <- pairs[i,1]
        row_b <- pairs[i,2]
        a_tests <- x[row_a,testCols]
        b_tests <- x[row_b,testCols]
        comp <- rbind(comp, c(row_a, row_b, TestsCompare(a_tests, b_tests)))
      }
      colnames(comp) <- c("row_a","row_b","overlaps","matches","non_matches")
      return(comp)
    }
    
    out = lapply(data.split, RowCompare)
    

    生产:

    > out
    $Sample1
         row_a row_b overlaps matches non_matches
    [1,]     1     2        8       6           2
    
    $Sample2
         row_a row_b overlaps matches non_matches
    [1,]     1     2       10       9           1
    [2,]     1     3        9       8           1
    [3,]     2     3        9       9           0
    

    【讨论】:

    • 谢谢!一般来说,我认为这很好,可以让我开始,但我也想确切地知道哪些测试是匹配的和不匹配的。请参阅我的 out.merge 示例。有没有办法包含这些信息?
    • @C8H10N4O2 你将如何并行处理这些函数?
    • @wake_wake 这本身就是一个问题,但有关相关问题,请参阅我的回答 here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2012-09-22
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多