假设,我有一个df $ col,长度为8:
1
2
3
4
5
6
7
8
我想将其分为三个不同的部分,并尽可能多地"可能性"。这样:
1 2 345678
1 23456 78
1 234567 8
123 45 678
123456 7 8
so on...
有人可以在r中提出一个简单的解决方案吗?谢谢
我对情况有所推广:
vec <- letters[1:8]
n <- 2
combn(length(vec)-1,n,function(x){
for(i in rev(x)) vec <- append(vec," ",i)
paste0(vec,collapse="")})
# [1] "a b cdefgh" "a bc defgh" "a bcd efgh" "a bcde fgh" "a bcdef gh" "a bcdefg h" "ab c defgh" "ab cd efgh" "ab cde fgh" "ab cdef gh"
# [11] "ab cdefg h" "abc d efgh" "abc de fgh" "abc def gh" "abc defg h" "abcd e fgh" "abcd ef gh" "abcd efg h" "abcde f gh" "abcde fg h"
# [21] "abcdef g h"
这个想法是您有7个可以切割的地方,因此我们在其中使用Combn进行了样品。它给出了一个不错的矩阵,我们可以通过combn
的FUN
参数即时 apply
形成我们的串联。
我最终使用了一个很好的旧循环来概括n个参数,但我们也可以使用递归函数来做到这一点。
我喜欢这个问题。您的问题归结为选择1到10之间的3个整数的所有有序组合。这些组合使您可以在哪里分配原始矢量。
您只需要编写一个函数即可拆分基于位置向量的向量。他们将此功能应用于所有可能的位置向量。
x=1:5
n.group=3
splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% pos)))
apply(combn(length(x),n.group),2,function(pos) splitAt(x,pos))
输出是列表
[[1]]
[[1]][[1]]
[1] 1
[[1]][[2]]
[1] 2
[[1]][[3]]
[1] 3 4 5
[[2]]
[[2]][[1]]
[1] 1
[[2]][[2]]
[1] 2 3
[[2]][[3]]
[1] 4 5
...
[[10]]
[[10]][[1]]
[1] 1 2
[[10]][[2]]
[1] 3
[[10]][[3]]
[1] 4
[[10]][[4]]
[1] 5