我想通过替换具有多种可能性的字符来生成包含所有组合列表的数据框的新列,例如:
我有一个使用此代码生成的表:
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。第二列中组合之间的空间不是必需的(我将其放在示例中进行解释。
答案 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 )