我有两个测试组的结果(每个组测试了相同的样品),我想评估两组结果之间的异同。我想对2组结果之间从1到4的不同匹配程度进行评分。对于每个样本,都有成对的结果,中间用“ +”分隔。如果两个结果相同,则我希望分数为1,如果它们匹配但一个或另一个基因是歧义的(用'/'表示),则分数为2,分数3 =如果组1的结果不明确,但是组2是无歧义的,但它们共享一个基因,得分4 =如果第2组具有歧义的结果,但组1是无歧义,但它们共享一个基因,得分0 =不匹配,即两组的结果均不共享任何基因顺序。
Group1 Group2 Match
Y*01:01+Y*01:01 Y*01:01+Y*01:01 1
Y*01:03+Y*01:01 Y*01:01+Y*01:03 1
Y*01:01:02+Y*01:01:01 Y*01:01:02+Y*01:01:01 1
Y*01:01/Y*01:02+Y*01:01 Y*01:01/Y*01:02+Y*01:01 2
Y*01:01/Y*01:02+Y*01:01/Y*01:02 Y*01:01/Y*01:02+Y*01:01/Y*01:02 2
Y*01:01/Y*01:02+Y*01:01 Y*01:02+Y*01:01 3
Y*01:03+Y*01:01 Y*01:03/Y*01:06+Y*01:01 4
Y*01:01+Y*01:02 Y*01:03+Y*01:04 0
Y*01:01/Y*01:02+Y*01:01/Y*01:02 Y*01:03/Y*01:04+Y*01:06/Y*01:06 0
我尝试了以下公式,但是它为我提供了一个总体的“真”得分,而没有匹配则为“假”。我不知道如何适应它以生成不同级别的匹配
df = as.data.frame(mapply(function(x,y) all(x==y),
lapply(strsplit(df$`group1`, "[+]"), sort),
lapply(strsplit(df$`group2`, "[+]"), sort)))
答案 0 :(得分:1)
也许有一种更好的向量化方法,但是如果您可以接受逐行处理,那么这里是一个建议。 (如果要处理“大量”数据,这可能会很慢。)(下面是数据。)(编辑用于处理更多的比较。)
gene_compare <- function(a,b) {
sa <- sort(strsplit(a, "[+]")[[1]])
sb <- sort(strsplit(b, "[+]")[[1]])
if (all(sa == sb)) {
if (any(grepl("/", c(a,b)))) return(2L) else return(1L)
} else if (all(mapply(function(m,n) any(m == n), strsplit(sa, "/"), sb))) return(3L)
else if (all(mapply(function(m,n) any(m == n), sa, strsplit(sb, "/")))) return(4L)
else if (any(sa == sb)) return(5L)
else return(0L)
}
mapply(gene_compare, dat$Group1, dat$Group2, USE.NAMES=FALSE)
# [1] 1 1 1 2 2 3 4 0 0 5
如果您使用/更喜欢tidyverse
动词:
dat %>%
mutate(Match2 = purrr::map2(Group1, Group2, gene_compare))
# Group1 Group2 Match Match2
# 1 Y*01:01+Y*01:01 Y*01:01+Y*01:01 1 1
# 2 Y*01:03+Y*01:01 Y*01:01+Y*01:03 1 1
# 3 Y*01:01:02+Y*01:01:01 Y*01:01:02+Y*01:01:01 1 1
# 4 Y*01:01/Y*01:02+Y*01:01 Y*01:01/Y*01:02+Y*01:01 2 2
# 5 Y*01:01/Y*01:02+Y*01:01/Y*01:02 Y*01:01/Y*01:02+Y*01:01/Y*01:02 2 2
# 6 Y*01:01/Y*01:02+Y*01:01 Y*01:02+Y*01:01 3 3
# 7 Y*01:03+Y*01:01 Y*01:03/Y*01:06+Y*01:01 4 4
# 8 Y*01:01+Y*01:02 Y*01:03+Y*01:04 0 0
# 9 Y*01:01/Y*01:02+Y*01:01/Y*01:02 Y*01:03/Y*01:04+Y*01:06/Y*01:06 0 0
# 10 Y*02:01:01+Y*02:01:01 Y*02:01:01+Y*02:01:50 5 5
# >
性能下降有两种形式:逐行操作;并嵌套(重复)mapply
个调用。
数据:
dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Group1 Group2 Match
Y*01:01+Y*01:01 Y*01:01+Y*01:01 1
Y*01:03+Y*01:01 Y*01:01+Y*01:03 1
Y*01:01:02+Y*01:01:01 Y*01:01:02+Y*01:01:01 1
Y*01:01/Y*01:02+Y*01:01 Y*01:01/Y*01:02+Y*01:01 2
Y*01:01/Y*01:02+Y*01:01/Y*01:02 Y*01:01/Y*01:02+Y*01:01/Y*01:02 2
Y*01:01/Y*01:02+Y*01:01 Y*01:02+Y*01:01 3
Y*01:03+Y*01:01 Y*01:03/Y*01:06+Y*01:01 4
Y*01:01+Y*01:02 Y*01:03+Y*01:04 0
Y*01:01/Y*01:02+Y*01:01/Y*01:02 Y*01:03/Y*01:04+Y*01:06/Y*01:06 0
Y*02:01:01+Y*02:01:01 Y*02:01:01+Y*02:01:50 5')