如何使用 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)
}
我想我的问题很简单,但到目前为止我还没有找到我的错误。 我想创建一个有 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)
}