2017-07-11 84 views
0

想想我有一个简单的问题,但到目前为止我无法找到我的错误。 我想创建一个有32名参与者的单一淘汰赛。要做到这一点,我创建4组8名球员,现在是想建立一个在对决for循环,并将它们存储到一个列表,但它不工作,我想:(如何在列表中存储循环遍历列表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 

现在我想存储他们在他们的小组对有一个容易获得计算后再夺道具 应该是这样的第一组

>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'好吗? – CPak

+0

只是为了解释错误:如果您使用$ i,R将不会评估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) 
}