2013-08-23 47 views
3

在R中,我需要一个有效的解决方案来洗牌列表中包含的元素,保留元素的总数和本地元素的大小(在这种情况下,列表中的每个元素是一个向量)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" 

的洗牌应随机选择列表中的字母(无需更换),并把它们在列表中的任何载体的随机位置。

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

+2

你只是想在每个向量中的元素在向量中洗牌吗?或者你想要列表的结构相同,但是所有元素(组合)都要洗牌?因此,如果'a'是第一个向量的元素,'a'必须位于第一个向量之后,或者它可能在第二个向量中结束? – Dason

+0

嗨Dason,元素应该在整个列表中洗牌,即第一个向量中的一个字母可以在任何其他向量中结束 – Thrawn

回答

9

,你可以尝试重新创建第二列表与第一的骨架,并与第一列表中的所有元素,这样的填充:

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" 

希望这有助于!

+3

我总是忘记'relist'。很好的答案。 – Dason

+2

所有功劳归于我们的实习生Paul,公平地对待 –

+1

我个人喜欢这个版本预编辑更多。它在'l < - list(5)'的情况下给出了正确的答案,而新版本则没有。 – Dason

3

这样子......?

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

这是一个很好的答案,但它只会在矢量内洗牌字母。对不起,我不明白我想要什么:-( – Thrawn

+3

显然这不是他们想要的 - 但这并不影响我。这里棘手的部分是* if *列表包含整数,并且最终得到一个向量因为样本(5)实际上与样本(1:5)相同,所以有时可能会很方便,但是我个人认为这不一定是件好事... – Dason

+1

我没有完全完成理解OP的问题:( –