如何对单词列表进行随机播放?
How to perform shuffle on a list of words?
我想使用 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()
应该只用于整数吗?如何对上面的列表进行随机播放?还有其他功能吗?
为什么不用样本?
> 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"
如果您想生成整个随机排列,而不是随机排列,您可以尝试以下操作:
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
希望对您有所帮助。
这实际上是对其他答案的跟进 - 给他们两个都投赞成票,而不是这个。
如果您想做的只是随机排列一个观察向量,sample()
来自基础 R 安装就可以正常工作(如 @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()
被设计为受限排列的接口,但它们需要将完全随机化作为一种特殊情况进行处理,因此如果你深入挖掘,你会发现 shuffle
或 shuffleSet
调用 shuffleFree
并在内部使用 sample.int()
(出于效率原因,但出于所有意图和目的,这是对 sample()
的调用更明确一点设置所有参数。)
因为这两个函数是为更一般的问题设计的,所以我们只需要知道要迭代的观察次数;因此,两者的第一个参数应该是观察次数。如果你给它们传递一个 vector,那么作为一点点糖,我只是根据对象的大小计算 n
(向量的长度,矩阵的 nrow 等) .
@RHertel 注意到 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
属于 class "character"
并且没有 nobs()
方法(但是我会在 permute 中修复它,以便它在未来工作。)
shuffle
和 shuffleSet
return 要排列的事物的 索引 的排列,而不是排列的元素本身;事实上,他们从来不知道你想要排列的实际 elements/things。因此,为什么 @RHertel 使用 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
上的 []
否则你会覆盖 perms
而不是替换 到位 .
我想使用 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()
应该只用于整数吗?如何对上面的列表进行随机播放?还有其他功能吗?
为什么不用样本?
> 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"
如果您想生成整个随机排列,而不是随机排列,您可以尝试以下操作:
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
希望对您有所帮助。
这实际上是对其他答案的跟进 - 给他们两个都投赞成票,而不是这个。
如果您想做的只是随机排列一个观察向量,sample()
来自基础 R 安装就可以正常工作(如 @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()
被设计为受限排列的接口,但它们需要将完全随机化作为一种特殊情况进行处理,因此如果你深入挖掘,你会发现 shuffle
或 shuffleSet
调用 shuffleFree
并在内部使用 sample.int()
(出于效率原因,但出于所有意图和目的,这是对 sample()
的调用更明确一点设置所有参数。)
因为这两个函数是为更一般的问题设计的,所以我们只需要知道要迭代的观察次数;因此,两者的第一个参数应该是观察次数。如果你给它们传递一个 vector,那么作为一点点糖,我只是根据对象的大小计算 n
(向量的长度,矩阵的 nrow 等) .
@RHertel 注意到 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
属于 class "character"
并且没有 nobs()
方法(但是我会在 permute 中修复它,以便它在未来工作。)
shuffle
和 shuffleSet
return 要排列的事物的 索引 的排列,而不是排列的元素本身;事实上,他们从来不知道你想要排列的实际 elements/things。因此,为什么 @RHertel 使用 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
上的 []
否则你会覆盖 perms
而不是替换 到位 .