洗牌向量 - sample() 的所有可能结果?

ozj*_*bob 3 r shuffle sampling

我有一个包含五个项目的向量。

my_vec <- c("a","b","a","c","d")
Run Code Online (Sandbox Code Playgroud)

如果我想将这些值重新排列成一个新的向量(shuffle),我可以使用 sample():

shuffled_vec <- sample(my_vec)
Run Code Online (Sandbox Code Playgroud)

简单 - 但 sample() 函数只给了我一种可能的洗牌。如果我想知道所有可能的洗牌组合怎么办?各种“combn”的功能似乎并没有帮助,expand.grid()给我的每一个可能的组合都更换,当我需要它无需更换。执行此操作的最有效方法是什么?

请注意,在我的向量中,我有两次值“a”——因此,在返回的一组混洗向量中,它们都应该在集合中都有两次“a”。

Das*_*son 5

我认为permn从组合包做你想要的

library(combinat)
permn(my_vec)
Run Code Online (Sandbox Code Playgroud)

一个较小的例子

> x
[1] "a" "a" "b"
> permn(x)
[[1]]
[1] "a" "a" "b"

[[2]]
[1] "a" "b" "a"

[[3]]
[1] "b" "a" "a"

[[4]]
[1] "b" "a" "a"

[[5]]
[1] "a" "b" "a"

[[6]]
[1] "a" "a" "b"
Run Code Online (Sandbox Code Playgroud)

如果重复是一个问题,你可以做类似的事情来摆脱重复

strsplit(unique(sapply(permn(my_vec), paste, collapse = ",")), ",")
Run Code Online (Sandbox Code Playgroud)

或者可能是删除重复项的更好方法......

dat <- do.call(rbind, permn(my_vec))
dat[duplicated(dat),]
Run Code Online (Sandbox Code Playgroud)