如何解决如何使用R在字符中获得不同的组合?
这是我的字符 "NGNG" ,这里 N 代表 c("A","T","C","G") 中的任何一个,所以在我的输出中我总共需要 16 种组合,例如 AGAG, TGAG、CGAG、GGAG、TGTG、TGCG、TGGG 等。
如果一开始只有一个更改,例如“NGG”,我可以使用 tidyr 的 expand_grid 轻松完成
RANGE
但是当 N 位于中间或它的倍数时,我正在努力寻找一种方法来做到这一点。
解决方法
expand.grid
后跟 do.call
怎么样?
cart_prod <- expand.grid(c("A","T","C","G"),"G",c("A","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”,我们只需让第一个 1st 和 3rd 参数在可能的选择上有所不同:{ {1}}。现在,使用前 4 个参数调用 c("A","G")
为:
expand.grid
将产生一个与我们想要的结果同构的 c("A","G")
"G"
c("A","G")
"G"
,因为 data.frame
返回 Cartesian product。
expand.grid
现在,剩下的就是将柱子砸在一起。我们利用 expand.grid(c("A","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)
上找到了这个很好的解释:The {do.call} function。这是第一行:
“R 有一个有趣的函数叫做 do.call。这个函数允许你调用任何 R 函数,但不是一个一个地写出参数,你可以使用一个列表来保存函数的参数。”
由于 do.call
本质上是一个 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"
瞧!我们得到了我们想要的结果。
,这是一种关于如何实现所需输出的奇怪方法: 以下是有关此解决方案的一些注意事项:
- 我将
map2
函数用大括号包裹起来,这样我就可以自己选择.x
和.y
作为%>%
将 LHS(这里是一个数据框)放在第一个参数中 -
exec
函数在参数列表上应用一个函数,它在基础 R 中的作用更像do.call
并且使用!!!
将拼接结果列表的元素,使每个元素成为一个then 受行约束的参数
library(purrr)
N <- c("A","G")
expand.grid(N,N) %>%
{map2(.$Var1,.$Var2,~ paste0(.x,.y,"G"))} %>%
exec(rbind,!!!.)
[,1]
[1,] "AGAG"
[2,] "TGAG"
[3,] "CGAG"
[4,] "GGAG"
[5,] "AGTG"
[6,] "TGTG"
[7,] "CGTG"
[8,] "GGTG"
[9,] "AGCG"
[10,] "TGCG"
[11,] "CGCG"
[12,] "GGCG"
[13,] "AGGG"
[14,] "TGGG"
[15,] "CGGG"
[16,] "GGGG"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。