2013-08-23 50 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的問題:( –