当前位置: 首页 > 知识库问答 >
问题:

配子位置的所有可能的唯一对组合

韶镜
2023-03-14

我有以下格式的配子数据:

Ind Letter Place Position
1   A      19    23
2   B      19    23
3   B      19    23
4   B      19    23
1   B      19    34
2   A      19    34
3   B      19    34
4   B      19    34
1   C      19    52
2   T      19    52
3   C      19    52
4   T      19    52
1   T      33    15
2   T      33    15
3   T      33    15
4   C      33    15
1   C      33    26
2   T      33    26
3   T      33    26
4   C      33    26

数据输出:

structure(list(Ind = c(1L,2L,3L,4L,1L,2L,3L,4L,1L,2L,3L,4L,1L,2L,3L,4L,1L,2L,3L,4L),
      Letter = structure(c(1L,2L,2L,2L,2L,1L,2L,2L,3L,4L,3L,4L,4L,4L,4L,3L,3L,4L,4L,3L),
                       .Label = c("A","B","C","T"), class="factor"), 
      Place = c(19L,19L,19L,19L,19L,19L,19L,19L,19L,19L,19L,19L,33L,33L,33L,33L,33L,33L,33L,33L),
      Position = c(23L,23L,23L,23L,34L,34L,34L,34L,52L,52L,52L,52L,15L,15L,15L,15L,26L,26L,26L,26L)),
    .Names = c("Ind","Letter","Place","Position"),
    class="data.frame", row.names = c(NA,-20L))

我需要对它们进行配对和组合,所以我参考一对中的位置得到所有可能的唯一组合。我有另一个数据文件,其中包含对的信息,它们是参考Place配对的。所以在这个文件中,我可以看到Place 19 Place 33是一对,我想要以下结果:

Ind Letter Place Position Ind Letter Place Position
1   A      19    23       1   T      33    15
2   B      19    23       2   T      33    15
3   B      19    23       3   T      33    15
4   B      19    23       4   C      33    15

1   A      19    23       1   C      33    26
2   B      19    23       2   T      33    26
3   B      19    23       3   T      33    26
4   B      19    23       4   C      33    26

1   B      19    34       1   T      33    15
2   A      19    34       2   T      33    15
3   B      19    34       3   T      33    15
4   B      19    34       4   C      33    15

1   B      19    34       1   C      33    26
2   A      19    34       2   T      33    26
3   B      19    34       3   T      33    26
4   B      19    34       4   C      33    26

1   C      19    52       1   T      33    15
2   T      19    52       2   T      33    15
3   C      19    52       3   T      33    15
4   T      19    52       4   C      33    15

1   C      19    52       1   C      33    26
2   T      19    52       2   T      33    26
3   C      19    52       3   T      33    26
4   T      19    52       4   C      33    26

在这种情况下,“唯一”表示A1:A2等于A2:A1。我之所以想这样做,是因为我想对这对字母进行四配子测试,看看是否所有可能的字母组合都存在。例如,对于上面最后一个组合对,我们有字母对CC,TT,CT,TC,所以这个组合对将通过FGT。

我尝试了与扩展结合。网格,因为这似乎非常接近我想要的。然而,当我需要所有数据$Position的组合时,我会丢失Ind、Letter和Place的信息。此外,输出包括非唯一对。

有人能给我指出一个更接近我想要的工具吗?或者给我一些关于如何修改expand.grid以获得我需要的东西的指导方针。如果你知道一个工具,它实际上可以进行四配子测试,或者类似的东西,那么我当然也会感兴趣。

共有1个答案

白浩气
2023-03-14

您可以使用expand.grid,但不能直接在位置列上。这个想法是找到“四重奏”(唯一位置)的所有组合:

pair <- c(19, 33)

df1 <- df1[df1$Place %in% pair, ]
split1 <- split( df1, df1$Position)

vec1 <- unique(df1$Position[df1$Place == pair[1]])
vec2 <- unique(df1$Position[df1$Place == pair[2]])

combin_num <- expand.grid(vec2, vec1)[,2:1]

do.call( 
  rbind,
  lapply(seq_len(nrow(combin_num)), function(i){
    cbind( split1[[as.character(combin_num[i,1])]], 
           split1[[as.character(combin_num[i,2])]]  )
  })
)[,]

结果:

#       Ind Letter Place Position Ind.1 Letter.1 Place.1 Position.1
#   1     1      A    19       23     1        T      33         15
#   2     2      B    19       23     2        T      33         15
#   3     3      B    19       23     3        T      33         15
#   4     4      B    19       23     4        C      33         15
#   5     1      A    19       23     1        C      33         26
#   6     2      B    19       23     2        T      33         26
#   7     3      B    19       23     3        T      33         26
#   8     4      B    19       23     4        C      33         26
#   51    1      B    19       34     1        T      33         15
#   61    2      A    19       34     2        T      33         15
#   71    3      B    19       34     3        T      33         15
#   81    4      B    19       34     4        C      33         15
#   52    1      B    19       34     1        C      33         26
#   62    2      A    19       34     2        T      33         26
#   72    3      B    19       34     3        T      33         26
#   82    4      B    19       34     4        C      33         26
#   9     1      C    19       52     1        T      33         15
#   10    2      T    19       52     2        T      33         15
#   11    3      C    19       52     3        T      33         15
#   12    4      T    19       52     4        C      33         15
#   91    1      C    19       52     1        C      33         26
#   101   2      T    19       52     2        T      33         26
#   111   3      C    19       52     3        T      33         26
#   121   4      T    19       52     4        C      33         26
 类似资料:
  • 我有个算法问题。我试图从一个更大的值集合中找到所有唯一的值子集。 例如,假设我有集。我能用什么算法找到3的这些子集? 子集不应重复,且顺序不重要,因此集{1,2,3}与集{3,2,1}相同。鼓励使用Psudocode(或常规类型)。

  • 问题内容: 当我尝试做这样的事情时,我意识到我真的需要上大学! 无论如何,我都有一个字符串数组(275),我需要遍历它们并用Java创建所有可能对的字符串。 我一直在学习递归,但是我找不到答案。 问题答案: 如果对和不同,请执行以下操作: 如果没有,请执行以下操作: 请注意,我假设数组包含唯一的字符串!

  • 问题内容: 我需要获取数组的所有可能的子集,其中至少要包含2个项目,而最大未知数。有人可以帮助我一点吗? 说我有这个… …我怎么得到这个? 问题答案: 窃取此JavaScript组合生成器后,我添加了一个参数以提供最小长度,从而, 要使用,提供一个数组以及所需的最小子集长度, 输出是

  • 我有一个数字数组,现在我必须通过生成给定数组的所有可能子数组并应用一些条件来找到元素之和。 条件是,对于每个子阵列,获取最小值,并找到其中的元素总数,然后将两者相乘(最小值*总数)。最后,将所有子阵列的所有这些相乘值相加。 以下是问题陈述: 使用下面的公式找到所有可能的子数组的总和: 和(左,右)=(最小的arr[i]) * (∑ arr[i]),其中i的范围从左到右。 例子: 子数组是:[sta

  • 问题内容: 我正在尝试打印给定列表的所有可能结果,并且我想知道如何在列表的各个位置添加值。例如,如果我的名单是,我要插入到列表中的所有可能的索引,使得它会返回此,,。 我在考虑使用for循环,但不确定如何启动。 问题答案: 您可以通过以下列表理解来做到这一点: 以您的示例为例:

  • 假设我有一个由n个字符串列表组成的列表: result->包含所有输出列表(所有组合) current->是当前的组合 用上述相同示例调用此函数时的输出: