简体   繁体   English

如何使用R在列表中的列上存储循环

[英]how to store a loop over columns in a list with R

Think I have an easy question but I was not able to find my mistake so far. 认为我有一个简单的问题,但到目前为止我还没有发现我的错误。 I want to create a single elimination tournament with 32 participants. 我想创建一个32人参加的淘汰赛。 To do so I created 4 groups with 8 Players and now a want to build the matchups with a for loop and store them into a list, but its not working as I want :( 为此,我用8个玩家创建了4个组,现在想用一个for循环构建对决并将其存储到列表中,但是它不能按我的意愿进行工作:(

>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

now I want to store them as pairs in their groups to have an easy access to calculate winning props later on. 现在,我想将它们成对存储在组中,以便以后可以轻松计算获胜道具。 Should look like this for the first Group A 第一组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"

my idea for the loop was: 我对循环的想法是:

groupnames <- colnames(groups)

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

I get the error, that "data" must be a vector type? 我收到错误消息,认为“数据”必须是向量类型?

Thx, if you can help me here! 谢谢,如果您可以在这里帮助我!

Assuming your groups variable is a dataframe, you can easily use lapply and you'll get a nice named list as a result: 假设您的groups变量是一个数据lapply ,则可以轻松使用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"

To bring it back into a single dataframe, you can use do.call(cbind,mylist) : 要将其带回到单个数据帧中,可以使用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"

You can't index with i in the loop using $ , because i is a character . 您无法使用$在循环中使用i进行索引,因为i是一个character Try this 尝试这个

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM