成对比较不同长度的多列

时间:2016-06-12 13:18:55

标签: r dataframe multiple-columns bioinformatics

我在R中有一个包含13列和6k多行的表,每列有不同的长度。我想生成一个新表,我将col1与col2进行比较,依此类推,col2与ncol相同,直到涵盖所有列。

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

CTC1vCTC2
chr6:86324663:T>C

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

    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)
}

这会返回以下错误:

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

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

由于

1 个答案:

答案 0 :(得分:1)

以下是一个函数,它取一个长度不等的向量(长度至少为2)的列表(被认为是列的列表)并返回一个数据框,它成对地比较列,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)
}