假设我有一个长度为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中建议一个简单的解决方案吗? 感谢
答案 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