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

how to store a loop over columns in a list with R

我想我的问题很简单,但到目前为止我还没有找到我的错误。 我想创建一个有 32 名参与者的单场淘汰赛。为此,我创建了 4 个组和 8 个玩家,现在我想用 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

现在我想将它们成对存储在它们的组中,以便以后轻松计算获胜道具。 第一组 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

我收到错误,"data" 必须是向量类型?

谢谢,如果你能帮到我!

假设您的 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"

您不能在使用 $ 的循环中使用 i 进行索引,因为 i 是一个 character。试试这个

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