在各个级别上匹配角色并生成分数

时间:2018-08-30 17:52:05

标签: r

我有两个测试组的结果(每个组测试了相同的样品),我想评估两组结果之间的异同。我想对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)))

1 个答案:

答案 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')