【问题标题】:Generate a list of all combinations by replacing a character with many possibilities通过替换具有多种可能性的字符来生成所有组合的列表
【发布时间】:2017-03-24 10:07:32
【问题描述】:

我想通过替换具有多种可能性的字符来生成包含所有组合列表的数据框的新列,例如:

我有一个使用此代码生成的表:

x <- expand.grid(rep(list(c('a', 'g', 't', 'c', 'n')), 3))
xx <- data.frame(do.call(paste0, x))
tabcomb <-  droplevels(xx[grep('n',xx[,1]),,drop=TRUE])
data.frame(tabcomb)

它给了我一个 61 行的表格,这里是前 10 行:

> head(tabcomb,10)
 tabcomb
 1  naa
 2  nga
 3  nta
 4  nca
 5  ana
 6  gna
 7  tna
 8  cna
 9  nna
 10 nag

字母n 可以是('a', 'c', 't' or 'g') 中的任何一个。我想生成第二列,其中包含通过替换 n 字母得到的所有组合的列表,以获得具有这种格式的表:

 tabcomb  all

 1  naa   aaa caa taa gaa
 2  nga   aga cga tga gga
 3  nta   ata cta tta gta
 4  nca   aca cca tca gca
 5  ana   aaa aca ata aga
 6  gna   gaa ...
 7  tna   taa ....
 8  cna   ........
 9  nna   aaa taa gaa caa aaa aca aga ata .....
 10 nag   .......
 11 nnn   ...............................

附:第二列组合之间的空格是不必要的(我把它放在示例中进行说明。

【问题讨论】:

    标签: r combinations


    【解决方案1】:

    我认为这可以按照您想要的形式工作(并且在序列中有 2 或 3 ns 的情况下给出很长的答案)...

    df<-data.frame(tabcomb)
    df$A <- sapply(as.character(df$tabcomb),function(S) {
      v <- lapply(1:3,function(i) ifelse(substr(S,i,i)=="n",list(c('a', 'g', 't', 'c')),list(substr(S,i,i))))
      z <- expand.grid(v[[1]][[1]],v[[2]][[1]],v[[3]][[1]])
      zz <- paste(do.call(paste0,z),collapse=" ")
      return(zz)
    })
    

    【讨论】:

    • 是的!这就是我需要的。谢谢!!
    【解决方案2】:
    df <- data.frame(tabcomb)
    df$tabcomb <- as.character(df$tabcomb)
    
    myfun <- function( x ) 
    {
      a1 <- lapply( as.list( strsplit( x, '')[[1]] ), function( y ) {
        if( y == 'n') { y <- c('a', 'c', 't', 'g') }
        y
      } )
      apply( expand.grid(a1), 1, paste, collapse = '' )
    }
    
    sapply( df$tabcomb, myfun )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多