【发布时间】: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