多列不同长度的成对比较
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)
}
我在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)
}