r - 如何使用R获得角色的不同组合?

标签 r dplyr combinations

这是我的角色“NGNG”,这里N代表c(“A”,“T”,“C”,“G”)中的任何一个,所以在我的输出中我总共需要16种组合,例如AGAG, TGAG、CGAG、GGAG、TGTG、TGCG、TGGG 等。

如果只是在开始时进行一次更改,例如“NGG”,我可以使用 tidyr 中的 Expand_grid 轻松完成

library(tidyverse)
expand_grid(one = c("A", "T", "C", "G"), two = "NG") %>% 
  mutate(three = paste0(one, two)) %>% 
  pull(three)


[1] "ANG" "TNG" "CNG" "GNG"

但是当 N 出现在它的中间或它的倍数时,我正在努力寻找一种方法来做到这一点。

最佳答案

expand.grid 后面跟着 do.call 怎么样?

cart_prod <- expand.grid(c("A", "T", "C", "G"),
                         "G",
                         c("A", "T", "C", "G"),
                         "G")
do.call(paste0, cart_prod)
[1] "AGAG" "TGAG" "CGAG" "GGAG" "AGTG" "TGTG" "CGTG" "GGTG"
[9] "AGCG" "TGCG" "CGCG" "GGCG" "AGGG" "TGGG" "CGGG" "GGGG"

说明

由于OP要求索引2和4保留为“G”,我们只需让第一个st和第三个rd参数根据可能的选择而变化:c("A", "T", "C", "G") 。现在,使用前 4 个参数调用 expand.grid:

c("A", "T", "C", "G")
"G"
c("A", "T", "C", "G")
"G"

将产生一个与我们期望的结果同构的 data.frame ,因为 expand.grid 返回 Cartesian product

expand.grid(c("A", "T", "C", "G"),
            "G",
            c("A", "T", "C", "G"),
            "G")
   Var1 Var2 Var3 Var4
1     A    G    A    G
2     T    G    A    G
3     C    G    A    G
4     G    G    A    G
5     A    G    T    G
6     T    G    T    G
7     C    G    T    G
8     G    G    T    G
9     A    G    C    G
10    T    G    C    G
11    C    G    C    G
12    G    G    C    G
13    A    G    G    G
14    T    G    G    G
15    C    G    G    G
16    G    G    G    G

现在,剩下的就是将柱子粉碎在一起。我们利用 do.callpaste0 来实现这一点。

为什么 do.call(paste0, some_data.frame) 有效?

我在 do.call 上找到了这个很好的解释:The {do.call} function。这是第一行:

"R has an interesting function called do.call. This function allows you to call any R function, but instead of writing out the arguments one by one, you can use a list to hold the arguments of the function."

由于 data.frame 本质上是底层的 list,因此我们可以以通常的方式利用 do.call

由于 cart_prod 的每一列只是一个向量,因此 paste0 会按元素组合每一列。例如,第一列和第二列是:

cart_prod$Var1
[1] A T C G A T C G A T C G A T C G
Levels: A T C G

cart_prod$Var2
[1] G G G G G G G G G G G G G G G G
Levels: G

paste0 应用于这两个,给出:

paste0(cart_prod$Var1, cart_prod$Var2)
[1] "AG" "TG" "CG" "GG" "AG" "TG" "CG" "GG"
[9] "AG" "TG" "CG" "GG" "AG" "TG" "CG" "GG"

正如您所看到的,我们开始看到我们想要的结果。如果我们将此结果与第三列结合起来,我们将得到:

paste0(paste0(cart_prod$Var1, cart_prod$Var2), cart_prod$Var3)
[1] "AGA" "TGA" "CGA" "GGA" "AGT" "TGT" "CGT" "GGT"
[9] "AGC" "TGC" "CGC" "GGC" "AGG" "TGG" "CGG" "GGG"

现在,我们将此结果与最后一列结合起来:

paste0(paste0(paste0(cart_prod$Var1, cart_prod$Var2), cart_prod$Var3), cart_prod$Var4)
[1] "AGAG" "TGAG" "CGAG" "GGAG" "AGTG" "TGTG" "CGTG" "GGTG"
[9] "AGCG" "TGCG" "CGCG" "GGCG" "AGGG" "TGGG" "CGGG" "GGGG"

瞧!我们已经得到了想要的结果。

关于r - 如何使用R获得角色的不同组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68131631/

相关文章:

python - 如何计算总和为给定值的倍数?

r - 在 R 3.0.1 中使用 pdflatex 或类似的东西

R图例不起作用

r - 短语的无监督语义聚类

r - 解析 dplyr 中的日期时间

r - 使用 ggplot 在 R 中创建堆叠的 "Progress"条形图

r - 在R中获取总和为274且最大值为4的所有组合

r - 使用 emmenas 为 post hoc 估计效果大小

r - 在两个时间戳之间左加入 R

python - 如何在具有不同定位的列表中获取字符串组合?