如何在单词列表上执行shuffle?

时间:2016-02-19 10:38:49

标签: r random shuffle sample permute

我想使用permute::shuffle/shuffleSet()或任何其他函数对R中的单词列表进行随机播放。

代码:

require(permute)
a <- c("Ar","Ba","Bl","Bu","Ca")
x <- list(a)
x
shuffleSet(x)
shuffle(x)

但是当我尝试这段代码时,我收到了错误

shuffleSet : Error in seq_len(n) : argument must be coercible to non-negative integer

shuffle : Error in factor(rep(1, n)) : 
  (list) object cannot be coerced to type 'integer'

permute::shuffle/shuffleSet()只应该只用于整数吗?如何对上面的列表进行洗牌?还有其他功能吗?

3 个答案:

答案 0 :(得分:3)

为什么不使用样品?

     > a <- c("Ar","Ba","Bl","Bu","Ca")
     > a
     [1] "Ar" "Ba" "Bl" "Bu" "Ca"
     > x <- list(a)
     > x
     [[1]]
     [1] "Ar" "Ba" "Bl" "Bu" "Ca"
     > x[[1]][sample(1:length(a))]
     [1] "Ba" "Bu" "Ar" "Bl" "Ca"

答案 1 :(得分:2)

如果你想生成整个shuffle集,而不是随机排列,你可以尝试以下方法:

require(permute)
a <- c("Ar","Ba","Bl","Bu","Ca")
x <- list(a)
y <- shuffleSet(as.factor(x[[1]]), quietly=TRUE)
y[] <- sapply(y, function(x) a[x])
y <- as.data.frame(y)
> head(y)
#  V1 V2 V3 V4 V5
#1 Ar Ba Bl Ca Bu
#2 Ar Ba Bu Bl Ca
#3 Ar Ba Bu Ca Bl
#4 Ar Ba Ca Bl Bu
#5 Ar Ba Ca Bu Bl
#6 Ar Bl Ba Bu Ca

希望这有帮助。

答案 2 :(得分:2)

这实际上是其他答案的后续行动 - 继续投票,而不是这一个。

如果您要做的只是随机置换观测矢量,基础R安装的sample()工作正常(如答案中@ t.f所示):

a <- c("Ar","Ba","Bl","Bu","Ca")
x <- list(a)
sample(a)
sample(x[[1]])

> sample(a)
[1] "Ca" "Bu" "Ba" "Ar" "Bl"
> sample(x[[1]])
[1] "Bl" "Ba" "Bu" "Ar" "Ca"

请注意,您不需要sample(1:length(a))或使用它来索引x[[1]];如果你给它一个矢量作为输入,sample()做正确的事情,如上所示。

shuffle()shuffleSet()被设计为限制排列的界面,但他们需要将完整的随机化视为特殊情况,因此如果你深入挖掘,你会看到{{1} }}或shuffle调用shuffleSet并在内部使用shuffleFree(出于效率原因,但出于所有意图和目的,这是对sample.int()的调用,只是更明确一些设置所有参数。)

因为这两个函数是针对更普遍的问题而设计的,所以我们需要知道的是迭代的观察数量;因此,两者的第一个论点应该是观察的数量。如果你传递一个向量,那么作为一点点糖,我只是根据对象的大小计算sample()(向量的长度,矩阵的nrow等)。

@RHertel指出,n生成了此集合shuffleSet()的所有排列。这是由于当该组排列很小时尝试提供更好的随机排列的启发式算法。生成所有排列集的更直接方法是通过a

来完成
allPerms()

请注意,> head(allPerms(seq_along(a))) [,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 5 4 [2,] 1 2 4 3 5 [3,] 1 2 4 5 3 [4,] 1 2 5 3 4 [5,] 1 2 5 4 3 [6,] 1 3 2 4 5 无法正常工作,因为allPerms(a)属于班级a而且没有"character"方法(但我是&#39} ;我将在置换中修复它,以便将来可以使用。)

nobs()shuffle会返回您想要置换的事物的 indices 的排列,而不是置换元素本身;事实上,他们从未真正了解您想要置换的实际元素/事物。因此,为什么@RHertel使用shuffleSet调用将置换索引应用于sapply。更快捷的方法是存储排列,然后将排列矩阵索引的a元素插回到这个排列矩阵中:

a

这里的效率是替换是在对perms <- allPerms(seq_along(a)) # store all permutations perms[] <- a[perms] # replace elements of perms with shuffled elements of a > perms <- allPerms(seq_along(a)) > perms[] <- a[perms] > head(perms) [,1] [,2] [,3] [,4] [,5] [1,] "Ar" "Ba" "Bl" "Ca" "Bu" [2,] "Ar" "Ba" "Bu" "Bl" "Ca" [3,] "Ar" "Ba" "Bu" "Ca" "Bl" [4,] "Ar" "Ba" "Ca" "Bl" "Bu" [5,] "Ar" "Ba" "Ca" "Bu" "Bl" [6,] "Ar" "Bl" "Ba" "Bu" "Ca" 的单个函数调用中完成的,而不是单独调用<-.[()。您需要[()上的[],否则您将覆盖perms而不是替换到位