将df $ col分成三组,在r中尽可能多的组合

时间:2018-03-27 21:25:45

标签: r split

假设我有一个长度为8的df $ col:

1
2
3
4
5
6
7
8  

我想把这个col分成三个不同的部分,尽可能多的“可能性”。像这样:

1  2  345678 

1 23456  78 

1 234567 8

123 45 678  

123456 7 8

so on... 

有人可以在r中建议一个简单的解决方案吗? 感谢

2 个答案:

答案 0 :(得分:5)

我稍微概括了一下案例:

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在它们中进行采样。它提供了一个很好的矩阵,我们可以apply动态通过FUN combn参数来形成我们的连接字符串。

我最后使用了一个很好的旧for循环来概括n参数,但我们也可以用递归函数来做。

答案 1 :(得分:3)

我喜欢这个问题。你的问题归结为选择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