通过替换具有多种可能性的角色来生成所有组合的列表

时间:2017-03-24 10:07:32

标签: r combinations

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

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

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   ...............................

P.S。第二列中组合之间的空间不是必需的(我将其放在示例中进行解释。

2 个答案:

答案 0 :(得分:3)

我认为这可以按照您想要的形式工作(并且在序列中有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)
})

答案 1 :(得分:1)

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 )
相关问题