【问题标题】:R - shuffle a list preserving element sizesR - 洗牌保留元素大小的列表
【发布时间】:2013-08-23 18:18:24
【问题描述】:

在 R 中,我需要一个有效的解决方案来打乱列表中包含的元素,保留元素的总数和局部元素的大小(在这种情况下,列表的每个元素都是一个向量)

a<-LETTERS[1:6]
b<-LETTERS[6:10]
c<-LETTERS[c(9:15)]

l=list(a,b,c)
> l
[[1]]
[1] "A" "B" "C" "D" "E" "F"

[[2]]
[1] "F" "G" "H" "I" "J"

[[3]]
[1] "I" "J" "K" "L" "M" "N" "O"

洗牌应该随机选择列表中的字母(无需替换),并将它们放在列表中任何向量的随机位置。

我希望我已经清楚了!谢谢:-)

【问题讨论】:

  • 你只是想让每个向量中的元素在向量中随机排列吗?或者您是否希望列表的结构相同但所有元素(组合)都被打乱?因此,如果 'a' 是第一个向量的一个元素,那么 'a' 必须在洗牌后出现在第一个向量中,还是最终出现在第二个向量中?
  • 嗨,Dason,元素应该在整个列表中打乱,即第一个向量中的字母可以在任何其他向量中结束

标签: r list


【解决方案1】:

您可以尝试使用第一个列表的骨架重新创建第二个列表,并用第一个列表的所有元素填充它,如下所示:

u<-unlist(l)
l2<-relist(u[sample(length(u))],skeleton=l)
> l2
[[1]]
[1] "F" "A" "O" "I" "S" "Q"

[[2]]
[1] "R" "P" "K" "F" "G"

[[3]]
 [1] "A" "N" "M" "J" "H" "G" "E" "B" "T" "C" "D" "L"

希望这会有所帮助!

【讨论】:

  • 我总是忘记relist。很好的答案。
  • 我个人更喜欢预编辑的版本。在l &lt;- list(5) 的情况下它给出了正确的答案,而新版本没有。
  • 我同意,你能把它放回原样吗?
  • 是的,对不起,我为了整洁而背叛了功能。我现在纠正了一个错误。
【解决方案2】:

像这样...?

> set.seed(1)
> lapply(l, sample)
[[1]]
[1] "B" "F" "C" "D" "A" "E"

[[2]]
[1] "J" "H" "G" "F" "I"

[[3]]
[1] "J" "M" "O" "L" "N" "K" "I"

【讨论】:

  • 这是一个很好的答案,但它只会对向量内的字母进行洗牌。很抱歉不清楚我想要什么:-(
  • 显然这不是他们想要的——但这并不困扰我。这里的棘手部分是 if 列表包含整数并且您最终得到一个长度为 1 的向量,结果将不会完全相同,因为 sample(5) 实际上与 sample(1 :5) 这有时很方便,但我个人认为这不一定是一件好事......
  • 我没有完全理解 OP 的问题 :(
  • 没关系 - 当第一次被问到这就是我发表评论的原因时,我也没有。他们编辑了问题以使其现在更清楚,但 Federico 已经是一个很好的答案。
猜你喜欢
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多