【问题标题】:Create a list of matrices with a loop and merging them in R使用循环创建矩阵列表并将它们合并到 R
【发布时间】:2013-11-07 16:42:25
【问题描述】:

我有几个矩阵,让我们简单地说我有 3 个矩阵。我想创建一个列表,然后使用 rbind 将一个放在另一个上。 如果我手动使用以下代码,它可以工作:

list<-list(matrix1,matrix2,matrix3)
test<-do.call("rbind",list)

我得到了一个 97947 行乘 4 列的矩阵,这正是我想要的。 但是如果我做一个循环,它就不起作用:

list2<-list()
for (i in 1:3)
{
y<-paste0("matrix",x)
list2[[x]] <- y
}
test2<-do.call("rbind",list2)

我得到一个 3x1 字符矩阵 ??? 有人可以指出我的错误吗? 任何 cmets 将不胜感激。 谢谢!!!!

【问题讨论】:

  • 我知道这可能看起来很烦人,但第一种方法有什么问题?!效率更高。我感觉您可能有很多矩阵,并且首先需要一种自动化方法将它们放入列表中。试试list &lt;- mget( ls( pattern = paste0( "matrix , 1:3 ) ) )
  • @SimonO101 我猜我不是唯一没有测试我的代码的人。 ;)
  • @Dr.Mike Dammit 你是完全正确的。抱歉,这里不需要模式匹配。如果您的矩阵有一组顺序名称,您只需要做更简单的list &lt;- mget( paste0( "matrix" , 1:3 ) )
  • 非常感谢!你是对的,使用 mget 更容易,非常感谢!!!!!!

标签: r list loops matrix


【解决方案1】:

考虑使用mget 之类的函数从globalenvironment(默认环境)获取所有矩阵对象并将它们放在一个列表中。然后,您可以使用 do.call 方法并避免循环。这是一个玩具示例:

#  Some data
m1 <- matrix( 1:4 , 2 , byrow = TRUE )
m2 <- matrix( 1:4 , 2 , byrow = TRUE )
m3 <- matrix( 1:4 , 2 , byrow = TRUE )

#  Use mget to put them in a list. mget searches the .GlobalEnvironment (by default) for the object names in it's first argument
list <- mget( paste0( "m" , 1:3 ) )
list
#$m1
#     [,1] [,2]
#[1,]    1    2
#[2,]    3    4

#$m2
#     [,1] [,2]
#[1,]    1    2
#[2,]    3    4

#$m3
#     [,1] [,2]
#[1,]    1    2
#[2,]    3    4

#  rbind them
do.call( rbind , list )
#     [,1] [,2]
#[1,]    1    2
#[2,]    3    4
#[3,]    1    2
#[4,]    3    4
#[5,]    1    2
#[6,]    3    4

【讨论】:

  • @user2917283 很高兴我能提供帮助。由于您是新手,您可能需要阅读网站的aboutFAQ 部分,以帮助您充分利用它。如果某个答案确实解决了您的问题,您可能需要考虑投票和/或将其标记为已接受,以表明问题已得到回答,方法是勾选合适答案旁边的绿色小复选标记。您没有义务这样做,但它有助于保持网站没有未回答的问题,并奖励那些花时间解决您的问题的人。
  • @SimonO'Hanlon - 我在运行 "list mget 中的错误(paste0 ("m", 1:3)) : 缺少参数 "envir",没有默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2019-08-12
  • 2014-09-03
  • 2021-05-24
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多