微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用R在字符中获得不同的组合?

如何解决如何使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?