我在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
我可能遗漏了一些明显的东西,非常感谢任何帮助。
由于
答案 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)
}