我想找到我的数据向量的所有可能组成,例如c(1:10)。我使用“分区”包中的组合功能来做到这一点。
首先,我找到所有可能的成分。例如,我想将10个向量的长度分成3个部分。
library(partitions)
compositions(10,3,include.zero = TRUE)
[1,] 10 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1
[2,] 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
[3,] 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2
[1,] 0 7 6 5 4 3 2 1 0 6 5 4 3 2 1 0 5 4 3 2 1 0 4 3 2 1 0 3 2 1
[2,] 8 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 0 1 2 3 4 5 0 1 2 3 4 0 1 2
[3,] 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 7 7 7
[1,] 0 2 1 0 1 0 0
[2,] 3 0 1 2 0 1 0
[3,] 7 8 8 8 9 9 10
下一步是找到与每种成分对应的所有对应值。这带来了一些麻烦,因为某些像元可能为零。如果单元格中没有任何内容,我想要一个空结果。我所做的是计算以上获得的矩阵的累加和。例如,c(1,3,6)的成分将变为c(1,4,10)。然后,我编写了一个函数以查找相应的值。向量(1,4,10)是函数中的输入n。
find_sequence <- function(n){
m=length(n)
temp=NULL
for(i in c(1:m)){
if(n[i]!=0) {
temp[[i]]=list(1:n[i])
}
}
idx=NULL
idx[[1]]=temp[[1]]
for(i in 2:m){
idx[[i]]=list(setdiff(unlist(temp[[i]]),unlist(temp[[i-1]])))
}
idx
}
通过这种方式,我可以获取不同成分的所有对应值,并允许空结果。但是我认为这种方式有点乏味,并且想知道是否有好的解决方案。
我希望从其中一个组成中获得(6,3,1)组成的三个单元格(1,2,3,4,5,6),(7,8,9),(10)结果。我将需要对所有作品进行此操作。特别是对于合成中的0值,我希望输出值为null。例如,(null),(1),(2,3,4,5,6,7,8,9,10)表示合成(0,1,9)。
我希望避免使用太多列表来稍微加快程序速度。 谢谢。