多列不同长度的成对比较

pairwise comparison of multiple columns with different lengths

我在R中有一个table,共有13列和6k奇数行,每列有不同的长度。我想生成一个新的 table ,其中我将 col1 与 col2 进行比较,依此类推,将 col2 与 ncol 进行比较,直到覆盖所有列。

如果匹配,新的 table 的第一列应该看起来像这样,如果不匹配,NA 应该代替染色体位置:

CTC1vCTC2
chr6:86324663:T>C

例如,这是我正在尝试处理的数据集的一个子样本,这只是前四列,理想情况下我想比较每个染色体位置(和突变)并确保它们完全匹配:

    CTC1    CTC2    CTC3    CTC4
    chr1:2333588:C>T    chr1:902108:C>T chr1:3544992:T>A    chr1:5924518:G>A
    chr1:2938989:G>A    chr1:1262966:C>T    chr1:6021929:G>T          chr1:5965381:C>T
    chr1:3389727:C>T    chr1:1325657:G>A    chr1:6273227:G>A    chr1:6279370:G>C

到目前为止我已经尝试过了,灵感来自于下面的答案:

match_table <- function(table){
  #the output table will have 78 columns
  new_table =data.frame(matrix("NA", nrow = nrow(table), ncol = 78))  
  for(i in ncol(table)){
    for(j in (i+1):ncol(table)){
      for (k in nrow(table)){
        if(table[k,i] == table[k,j] && !is.null(table[k,i])){
          new_table[k,i] <- table[k,i]
        } 
        else if(is.na(table[k,i])){
          new_table[k,i]='N'
        }
      }
      }
  }
  return(new_table)
}

此returns以下错误:

Error in if (table[k, i] == table[k, j] && !is.null(table[k, i])) { : missing value where TRUE/FALSE needed

我可能遗漏了一些明显的东西,非常感谢任何帮助。

谢谢

以下是一个函数,它采用不等长度向量列表(长度至少为 2)(被认为是列列表)和 returns 成对比较列的数据框,其中NA 没有对应的匹配项,有则为公共值。它要么是您问题的解决方案,要么(更有可能)至少可以给您一些想法:

match_columns <- function(columns){
  n <- length(columns)
  max_len = max(unlist(lapply(columns, length)))
  new_cols <- list()
  for(i in 1:(n-1)){
    for(j in (i+1):n){
      v <- rep(NA,length = max_len)
      for (k in seq(min(length(columns[[i]]), length(columns[[j]])))){
        if(columns[[i]][k] == columns[[j]][k]) v[k] <- columns[[i]][k]
      }
      nm <- paste0("col",i,"vcol",j)
      new_cols[[nm]] <- v
    }
  }
  data.frame(new_cols)
}