R 中的四配子测试

Four-Gamete-Test in R

我有(将有)数据,如下所示:

Individual Nuk Name       Position Individual.1 Nuk.1 Name.1     Position.1
Ind 1      A   Locus_1988 23       Ind 1        A     Locus_3333 15
Ind 2      A   Locus_1988 23       Ind 2        G     Locus_3333 15
Ind 3      G   Locus_1988 23       Ind 3        A     Locus_3333 15
Ind 4      G   Locus_1988 23       Ind 4        -     Locus_3333 15
Ind 5      A   Locus_1988 23       Ind 5        G     Locus_3333 15
Ind 6      G   Locus_1988 23       Ind 6        G     Locus_3333 15
Ind 1      C   Locus_1988 23       Ind 1        C     Locus_3333 18
Ind 2      T   Locus_1988 23       Ind 2        C     Locus_3333 18
Ind 3      T   Locus_1988 23       Ind 3        T     Locus_3333 18
Ind 4      C   Locus_1988 23       Ind 4        -     Locus_3333 18
Ind 5      -   Locus_1988 23       Ind 5        C     Locus_3333 18
Ind 6      T   Locus_1988 23       Ind 6        T     Locus_3333 18
Ind 1      T   Locus_2301 12       Ind 1        T     Locus_4123 38
Ind 2      T   Locus_2301 12       Ind 2        T     Locus_4123 38
Ind 3      A   Locus_2301 12       Ind 3        -     Locus_4123 38
Ind 4      -   Locus_2301 12       Ind 4        A     Locus_4123 38
Ind 5      A   Locus_2301 12       Ind 5        A     Locus_4123 38
Ind 6      T   Locus_2301 12       Ind 6        T     Locus_4123 38
Ind 1      G   Locus_2301 31       Ind 1        G     Locus_4123 52
Ind 2      C   Locus_2301 31       Ind 2        C     Locus_4123 52
Ind 3      C   Locus_2301 31       Ind 3        G     Locus_4123 52
Ind 4      G   Locus_2301 31       Ind 4        C     Locus_4123 52
Ind 5      -   Locus_2301 31       Ind 5        C     Locus_4123 52
Ind 6      G   Locus_2301 31       Ind 6        -     Locus_4123 52

数据以基因座对的形式构建(因此在上面,例如 Locus_1988 和 Locus_3333 是一对)。对于一对中的每个位置,我需要在 Nuk 上进行四配子测试 (FGT),即测试四个可能字母 GCAT 中任何给定 2 字母组合的所有可能的 2 对组合。 因此,对于上面的数据,Locus_1988 Position 23 + Locus_3333 Position 15 对的组合是 AA AG GA G- AG GG。由于存在 AA、AG、GA 和 GG 组合,这对将通过 FGT),这需要注册(即 new_column 中的 1)。 上面数据中的下一组是Locus_1988 Position 23 + Locus_3333位置18有如下组合:CC TC TT C- -C TT。由于缺少组合CT,该组将无法通过FGT(在new_column中注册为0)。

您将如何进行此测试?

有很多基因座,每个基因座有许多 (30) 个个体,一些基因座中的几个位置,但不是所有基因座,都需要测试。

我在想,应该可以按照以下方式构建测试:

if(grepl("AG" & "GA" & "AA" & "GG" | "AC" & "CA" & "AA" & "CC" | "AT" & "TA" & "AA" & "TT" | "CT" & "TC" & "CC" & "TT" | "CG" & "GC" & "CC" & "GG" | "GT" & "TG" & "GG" & "TT", data="combination of the two columns")) print("1") else print("0")

但显然不允许我使用 & |运营商。 此外,我在弄清楚如何首先参考名称然后参考位置来指定执行此操作时遇到了很多麻烦。 你会在新的列中给每个组一个唯一的名称吗(如下所示),并指定对每个组进行测试?

Individual Nuk Name       Pos Individual.1 Nuk.1 Name.1          Pos.1 Grp
Ind 1      A   Locus_1988 23       Ind 1        A     Locus_3333 15    1         
Ind 2      A   Locus_1988 23       Ind 2        G     Locus_3333 15    1
Ind 3      G   Locus_1988 23       Ind 3        A     Locus_3333 15    1
Ind 4      G   Locus_1988 23       Ind 4        -     Locus_3333 15    1
Ind 5      A   Locus_1988 23       Ind 5        G     Locus_3333 15    1
Ind 6      G   Locus_1988 23       Ind 6        G     Locus_3333 15    1
Ind 1      C   Locus_1988 23       Ind 1        C     Locus_3333 18    2
Ind 2      T   Locus_1988 23       Ind 2        C     Locus_3333 18    2
Ind 3      T   Locus_1988 23       Ind 3        T     Locus_3333 18    2
Ind 4      C   Locus_1988 23       Ind 4        -     Locus_3333 18    2
Ind 5      -   Locus_1988 23       Ind 5        C     Locus_3333 18    2
Ind 6      T   Locus_1988 23       Ind 6        T     Locus_3333 18    2
Ind 1      T   Locus_2301 12       Ind 1        T     Locus_4123 38    3
Ind 2      T   Locus_2301 12       Ind 2        T     Locus_4123 38    3
Ind 3      A   Locus_2301 12       Ind 3        -     Locus_4123 38    3
Ind 4      -   Locus_2301 12       Ind 4        A     Locus_4123 38    3
Ind 5      A   Locus_2301 12       Ind 5        A     Locus_4123 38    3
Ind 6      T   Locus_2301 12       Ind 6        T     Locus_4123 38    3
Ind 1      G   Locus_2301 31       Ind 1        G     Locus_4123 52    4
Ind 2      C   Locus_2301 31       Ind 2        C     Locus_4123 52    4
Ind 3      C   Locus_2301 31       Ind 3        G     Locus_4123 52    4
Ind 4      G   Locus_2301 31       Ind 4        C     Locus_4123 52    4
Ind 5      -   Locus_2301 31       Ind 5        C     Locus_4123 52    4
Ind 6      G   Locus_2301 31       Ind 6        -     Locus_4123 52    4

我认为这可以在一个循环中完成,但恐怕这可能需要很长时间才能处理,因为我有很多数据。

按位置和基因座名称拆分数据 (df1):

split1 <- split(df1, list(df1$Name, df1$Position, df1$Name.1, df1$Position.1), drop = TRUE)

创建测试:

do.call(rbind, 
  lapply(split1, function(x) {
    all_letters <- union( x$Nuk, x$Nuk.1 )
    all_letters <- all_letters[all_letters != "-"]
    letter_comb <- expand.grid(all_letters, all_letters, stringsAsFactors = FALSE)
    data.frame( 
      FGT = all(
        sapply( seq_len(nrow(letter_comb)), function(i) {
          any(x$Nuk == letter_comb[i,1] & x$Nuk.1 == letter_comb[i,2])
        })
      ),
      Name = x$Name[1], Position = x$Position[1], 
      Name.1 = x$Name.1[1], Position.1 = x$Position.1[1] 
    )  
  })
)

结果:

#                               FGT       Name Position     Name.1 Position.1
# Locus_1988.23.Locus_3333.15  TRUE Locus_1988       23 Locus_3333         15
# Locus_1988.23.Locus_3333.18 FALSE Locus_1988       23 Locus_3333         18
# Locus_2301.12.Locus_4123.38 FALSE Locus_2301       12 Locus_4123         38
# Locus_2301.31.Locus_4123.52  TRUE Locus_2301       31 Locus_4123         52