【问题标题】:multi-dimensional list? List of lists? array of lists?多维列表?清单清单?列表数组?
【发布时间】:2013-02-09 09:44:53
【问题描述】:

(我肯定在这个问题中使用了错误的术语,对此感到抱歉 - 我只是不知道用 R 术语描述这个问题的正确方法......)

我想创建异构对象的结构。尺寸不一定是矩形。在其他语言(如 C)中,我需要的可能只是“对象数组”。“对象”是指由不同成员组成的结构,即 R 中的列表 - 例如:

myObject <- list(title="Uninitialized title", xValues=rep(NA,50), yValues=rep(NA,50)) 

现在我想制作 100 个这样的对象,并且能够通过类似

的方式来称呼它们的成员
for (i in 1:100) {myObject[i]["xValues"]<-rnorm(50)}

for (i in 1:100) {myObject[i]$xValues<-rnorm(50)}

我会很感激任何关于这件事在哪里描述的提示。

提前致谢!

【问题讨论】:

  • 如果所有 100 个对象都属于同一类型,那么您可以使用 matrix。您可以在单个 list 中保存许多不同的矩阵。即,您将拥有一个list of matrices。如果对象的类型不同,您可以将它们存储在data.framelist 中,在这种情况下,您将拥有list of data.frameslist of lists
  • 如果尺寸总是矩形的(在你的情况下,100x50),并且内容总是同质的(在你的情况下,数字)然后创建一个 array/matrix 。如果您希望能够在单个列表上添加/删除/插入(或更改数据类型),请使用 list-of-lists

标签: arrays r list matrix nested-lists


【解决方案1】:

您是在寻找这只神兽的名字还是只是想知道它的方法? :) 我可能是错的,但我认为您只需将其称为列表列表.. 例如:

# create one list object
x <- list( a = 1:3 , b = c( T , F ) , d = mtcars )

# create a second list object
y <- list( a = c( 'hi', 'hello' ) , b = c( T , F ) , d = matrix( 1:4 , 2 , 2 ) )

# store both in a third object
z <- list( x , y )

# access x
z[[ 1 ]] 

# access y
z[[ 2 ]]

# access x's 2nd object
z[[ 1 ]][[ 2 ]]

【讨论】:

  • 我在寻找这个名字只是为了能够做出正确的搜索查询 - 找到某个描述它的地方,而不是浪费人们的时间向我解释这个:)
  • 在您的示例中,您创建了一个包含 2 个其他不同类型对象的对象。我需要的是拥有100个相同复合结构的对象(不知道听起来是否更清晰......)。
  • @VasilyA,我想你有 100 个列表 (A1, A2, ..., A100)。现在,通过B &lt;- list(A1, A2... A100) 来制作另一个列表(是的,您必须输入它们)。然后您可以访问B[[1]][[2]] 获取第一个列表的第二个元素,如 Anthony 所示。如果这不是您想要的,那么您将不得不编辑您的帖子以更好地解释。因为这似乎是您所要求的。
  • 是的,我的案例可以描述为 100 个列表 - 但当然键入它们不是我的解决方案(我以 100 为例,它可能是 1000):[阅读其他类似问题后,对我来说似乎R无法实现这样的事情,真可惜......不过感谢您的帮助。
  • @VasilyA - R 当然可以实现这样的事情 - 请参阅我上面的评论。
【解决方案2】:

我没有意识到您正在寻找创建相同结构的其他对象。你正在寻找replicate

my_fun <- function() {
    list(x=rnorm(1), y=rnorm(1), z="bla")
}
replicate(2, my_fun(), simplify=FALSE)

# [[1]]
# [[1]]$x
# [1] 0.3561663
# 
# [[1]]$y
# [1] 0.4795171
# 
# [[1]]$z
# [1] "bla"
# 
# 
# [[2]]
# [[2]]$x
# [1] 0.3385942
# 
# [[2]]$y
# [1] -2.465932
# 
# [[2]]$z
# [1] "bla"

【讨论】:

  • 酷,这是另一个非常好的解决方案(除了 thelatemail 提到的 lapply 示例)。非常感谢!
  • @VasilyA - 是的,replicate 只是 sapply 的包装,它是 lapply 的表亲。你知道的越多;-)
  • @thelatemail,可以和mapply一起使用吗?很难从mapply创建输出列表
  • @lodykvovchak - 我想你可能想要 Map 而不是 mapply。默认情况下,mapply 可能会将列表输出简化为矩阵或向量。 (Map 只是设置 SIMPLIFY=FALSE 的 mapply 的包装器)
【解决方案3】:

这是我目前的解决方案示例,也许对某人有用:

    NUM <- 1000 # NUM is how many objects I want to have
    xVal <- vector(NUM, mode="list")
    yVal <- vector(NUM, mode="list")
    title   <- vector(NUM, mode="list")
    for (i in 1:NUM) {
     xVal[i]<-list(rnorm(50))
     yVal[i]<-list(rnorm(50))
     title[i]<-list(paste0("This is title for instance #", i))
    }
   myObject <- list(xValues=xVal, yValues=yVal, titles=title)
   # now I can address any member, as needed:
   print(myObject$titles[[3]])
   print(myObject$xValues[[4]])  

【讨论】:

  • 您也许可以做一些更简单的事情,例如:lapply(1:10,function(y) list(title=paste("the title #",y,sep=""),x=rnorm(50),y=rnorm(50)) ) 其中1:10 是您要创建的列表的1:n 数量。
【解决方案4】:

如果尺寸始终为矩形(在您的情况下为 100x50),并且内容始终是同质的(在您的情况下为数字),则创建一个 2D 数组/矩阵 .

如果您希望能够在单个列表上添加/删除/插入(或更改数据类型),请使用 list-of-lists

【讨论】:

  • 不,我的意思是异构的,不必要的矩形对象。很抱歉在我的例子中没有说清楚
  • @VasilyA:好的,所以请点击您问题上的“编辑”按钮。没有埋没在几乎没有人会读到的cmets中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2011-05-18
相关资源
最近更新 更多