这是我的角色“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.call
和 paste0
来实现这一点。
为什么 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/