【问题标题】:How to perform shuffle on a list of words? [duplicate]如何对单词列表执行随机播放? [复制]
【发布时间】:2016-05-31 21:40:55
【问题描述】:

我想使用 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() 应该只用于整数吗?如何对上述列表执行随机播放?有没有其他功能可以做到这一点?

【问题讨论】:

  • 你试过shuffleSet(as.integer(x))
  • 稍作修改shuffleSet(as.integer(x[[1]]))
  • 当我尝试代码 shuffleSet(as.integer(x)) 我得到错误 shuffleSet(as.integer(x)) 中的错误:(列表)对象不能被强制输入“整数” .当我尝试代码 shuffleSet(as.integer(x[[1]])) 我得到错误 Error in seq_len(n) : argument must be coercible to non-negative integer 另外:警告消息:1:在 shuffleSet (as.integer(x[[1]])) :由强制 2 引入的 NA:在 seq_len(n) 中:“length.out”参数使用的第一个元素。这是否意味着 shuffle 不能与非整数一起使用?
  • 确定性、随机(“抽样”)还是随机播种?

标签: r random shuffle sample permute


【解决方案1】:

为什么不使用样本?

     > 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"

【讨论】:

  • 如果您跳过转换为列表,这会更容易:sample(a,length(a),replace=FALSE)
  • 带有示例的代码工作正常。谢谢你:)
  • @RVRLibra:没有set.seed() 的随机抽样是不可重现的,如果这段代码能接近生产环境,则绝对禁止。
【解决方案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

希望这会有所帮助。

【讨论】:

  • 整数转换仍有一些问题。我收到以下错误 seq_len(n) 中的错误:参数必须强制转换为非负整数此外:警告消息:1:在 shuffleSet(as.integer(x[[1]])) 中:强制转换 2 引入的 NA : 在 seq_len(n) : 'length.out' 参数中使用的第一个元素
  • 看来你没有使用我贴的代码。我没有使用as.integer(),而是as.factor()。有了这个,我无法确认您的错误消息。我只收到'nperm' &gt;= set of all permutations: complete enumeration. Set of permutations &lt; 'minperm'. Generating entire set.的消息,这不仅仅是一个信息。
  • @RVRLibra 我之前评论中描述的输出既不是警告也不是错误,可以使用选项quietly=TRUE 抑制。我已经相应地编辑了答案。
  • 我没有得到想要的输出。我收到错误消息“shuffleSet 中的错误(as.factor(x[[1]]),安静地 = TRUE):未使用的参数(安静地 = TRUE)”,我的输出是“[1] V1 (或0-length row.names)" 我不确定问题是什么
  • 我刚刚更新了我的包版本,它工作正常。谢谢你:)
【解决方案3】:

这实际上是对其他答案的后续 - 去投票他们两个,而不是这个。

如果您只想随机排列观察向量,则来自基本 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() 被设计为限制排列的接口,但它们需要将完全随机化作为一种​​特殊情况来处理,因此如果你深入挖掘,你会发现 shuffleshuffleSet 调用 @ 987654330@ 和内部使用 sample.int() (出于效率原因,但出于所有意图和目的,这是对 sample() 的调用,只是更明确地设置了所有参数。)

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

@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 属于 "character" 类,并且没有 nobs() 方法(但我会在 permute中修复它> 所以它会在未来工作。)

shuffleshuffleSet 返回要置换的事物的索引 的置换,而不是置换的元素本身;事实上,他们从未真正了解您想要置换的实际元素/事物。因此@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"

这里的效率在于替换是在对&lt;-.[() 的单个函数调用中完成的,而不是对[() 的单独调用。你需要 [] 上的 perms 否则你会覆盖 perms 而不是替换就地

【讨论】:

  • 感谢您这篇富有洞察力的帖子!我决定忽略您最初的建议,因为我认为在这里投赞成票是当之无愧的。
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多