2017-07-11 22 views
0

簡単な質問があると思うが、今まで私の間違いを見つけられなかった。 私は32人の参加者と1回の排除トーナメントを作りたいと思っています。私は:(リスト内の列にループを格納する方法R

>groups 
      A  B  C  D 
    1 Player1 Player9 Player17 Player25 
    2 Player2 Player10 Player18 Player26 
    3 Player3 Player11 Player19 Player27 
    4 Player4 Player12 Player20 Player28 
    5 Player5 Player13 Player21 Player29 
    6 Player6 Player14 Player22 Player30 
    7 Player7 Player15 Player23 Player31 
    8 Player8 Player16 Player24 Player32 

は今、私が保存したいしたいとそうするために、私は8人の選手となりましたforループで対戦を構築し、リストにそれらを保存したいとの4つのグループを作成したが、そのは動作していませんそのグループ内のペアとしてそれらは、後に小道具を受賞計算するための容易なアクセスを持っている は最初のグループA

>teams.group.A <- matrix(groups$A,nrow = 2,ncol = 4) 
>teams.group.A 
    [,1]  [,2]  [,3]  [,4]  
[1,] "Player1" "Player3" "Player5" "Player7" 
[2,] "Player2" "Player4" "Player6" "Player8" 

ループのための私のアイデアだったため、次のようになります。

groupnames <- colnames(groups) 

mylist <- list() 
for(i in groupnames){ 
    mylist[[i]] <- matrix(groups$i,nrow = 2,ncol = 4) 
} 
mylist 

「データ」はベクタータイプでなければならないというエラーが表示されますか?

Thx、ここで私を助けることができれば!

+0

出力として 'list'が必要ですか?あるいは 'data.frame'はOKですか? – CPak

+0

エラーを説明する目的のためだけです。$ iを使用すると、Rはiを評価しません。つまり、存在しないデータフレームではiという変数を直接検索します。あなたがグループ[、i]を使うと、この場合、私は現在の値に置き換えられます。いずれにしても、@Valが投稿した解決策は、ループが他の言語と同じくらいRで好まれないように進む方法です。 – friep

答えて

1

あなたgroups変数がデータフレームである、あなたは簡単にlapplyを使用することができますし、結果として素敵な名前のリストを取得しますと仮定:

# generate data 
players <- paste0('Player',1:32) 
grps <- data.frame(A=players[1:8],B=players[9:16],C=players[17:24],D=players[25:32]) 


#smoother version as suggested by P Lapointe: 
mylist <- lapply(grps,matrix,nrow=2) 

# more verbose 
# mylist <- lapply(grps,function(x) matrix(x,ncol = 4)) 


# output 

> mylist 
$A 
    [,1]  [,2]  [,3]  [,4]  
[1,] "Player1" "Player3" "Player5" "Player7" 
[2,] "Player2" "Player4" "Player6" "Player8" 

$B 
    [,1]  [,2]  [,3]  [,4]  
[1,] "Player9" "Player11" "Player13" "Player15" 
[2,] "Player10" "Player12" "Player14" "Player16" 

$C 
    [,1]  [,2]  [,3]  [,4]  
[1,] "Player17" "Player19" "Player21" "Player23" 
[2,] "Player18" "Player20" "Player22" "Player24" 

$D 
    [,1]  [,2]  [,3]  [,4]  
[1,] "Player25" "Player27" "Player29" "Player31" 
[2,] "Player26" "Player28" "Player30" "Player32" 

バック単一のデータフレームにそれを持って来るために、あなたはdo.call(cbind,mylist)を使用することができます:

> do.call(cbind,mylist) 
    [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  [,10]  [,11]  
[1,] "Player1" "Player3" "Player5" "Player7" "Player9" "Player11" "Player13" "Player15" "Player17" "Player19" "Player21" 
[2,] "Player2" "Player4" "Player6" "Player8" "Player10" "Player12" "Player14" "Player16" "Player18" "Player20" "Player22" 
    [,12]  [,13]  [,14]  [,15]  [,16]  
[1,] "Player23" "Player25" "Player27" "Player29" "Player31" 
[2,] "Player24" "Player26" "Player28" "Player30" "Player32" 
+1

引数を次のように関数に渡すことができます: 'lapply(grps、matrix、nrow = 2)' –

+0

素晴らしい!いつも学ぶ。 – Val

0

することはでき$を使用して、ループ内のiでないインデックス、icharacterですので。試してみてください

for (i in groupnames) { 
    mylist[[i]] = matrix(groups[[i]], nrow=2, ncol=4) 
} 
関連する問題