我自己完成了:
<br />
##如:把a,b,c,d分堆:<br />
##分成1堆:abcd<br />
##分成2堆:a+bcd; b+acd; c+abd; d+abc; ac+bd; ad+bc; ac+bd;<br />
##分成3堆:a+b+bd; a+c+bd; a+d+bc; b+c+ad; b+d+ac; c+d+ab;<br />
##分成4堆:a+b+c+d.<br />
library(gregmisc)<br />
f<-function(x,n=3){<br />
r=length(x);<br />
permutations(n=n,r=r,repeats.allowed=T)->mat<br />
f.count<-function(x){length(unique(x))}<br />
mat=mat[apply(mat,1,f.count)==n,]<br />
f.combine<-function(m,x){<br />
re<-rep('',n);<br />
for (i in 1:n){<br />
re[i]<-paste(x[m==i],sep='',collapse='')<br />
}<br />
return (re);<br />
}<br />
re<-apply(mat,1,f.combine,x=x);<br />
unique(as.character(re))->re2</p>
<p>f.unique<-function(m){<br />
re.in=rep(F,length(re2));<br />
for (i in 1:length(m)){<br />
re.in=re.in|(re2==m[i])<br />
}<br />
return (re.in);<br />
}<br />
re01<-t(apply(re,2,f.unique));<br />
re01<-matrix(as.double(re01),nrow(re01))<br />
re01<-apply(re01,1,paste,collapse='')<br />
re0<-unique(re01);</p>
<p>f.1<-function(u){<br />
L=1:length(re01);<br />
return (L[re01==u][1]);<br />
}<br />
ind2<-do.call(cbind,lapply(re0,f.1))<br />
return (re[,ind2]);<br />
}</p>
<p>x<-letters[1:4];</p>
<p>f(x,n=2)</p>
<p>
</p>
效果,每列是个结果
[data]
> f(x,n=2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] "abc" "abd" "ab" "acd" "ac" "ad" "a"
[2,] "d" "c" "cd" "b" "bd" "bc" "bcd"
> f(x,n=3)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "ab" "ac" "a" "ad" "a" "a"
[2,] "c" "b" "bc" "b" "bd" "b"
[3,] "d" "d" "d" "c" "c" "cd"
> f(x,n=4)
[1] "a" "b" "c" "d"
[/data]