5

我对在 R 中使用列表比较陌生。现在我想创建几个嵌套列表。我已经知道列表应包含的元素数量,现在想在将数据输入列表之前定义列表的大小。对于包含我使用的 2 个元素的最高级别的列表

list_example <- vector(mode="list", 2)

现在这两个元素中的每一个都应包含 3 个元素:再次包含列表的列表等等......我总共有 7 个级别,即 2*3*3*4*2*3*3 组合的树。有没有一种紧凑的方法来定义这种深度嵌套的列表结构的大小?非常感谢您提前!!

4

4 回答 4

8

您可以使用递归函数来做到这一点。

rec.list <- function(len){
    if(length(len) == 1){
        vector("list", len)
    } else {
        lapply(1:len[1], function(...) rec.list(len[-1]))
    }
}

l <- rec.list(c(2, 3, 3, 4, 2, 3, 3))

或者也许是一个 7 维列表数组?起初它可能看起来很奇怪,但它是一个完全有效的数据结构。

l <- vector("list", 2*3*3*4*2*3*3)
dim(l) <- c(2, 3, 3, 4, 2, 3, 3)
l[[1,1,1,1,1,1,1]] <- "content"
于 2013-07-10T09:52:42.843 回答
1

一个简单的方法来声明,例如,一个 3 的列表嵌套在一个 5 的列表中:

my.list<-lapply(my.list<-vector(mode = 'list',5),function(x) x<-vector(mode='list',3))

summary(my.list)

     Length Class  Mode
[1,] 3      -none- list
[2,] 3      -none- list
[3,] 3      -none- list
[4,] 3      -none- list
[5,] 3      -none- list

如果您想添加另一个嵌套列表,例如 2 个插槽,只需添加另一个 lapply,这样:

my.list<-lapply(my.list<-vector(mode = 'list',5),function(x) 
      x<-lapply(x<-vector(mode = 'list',3),function(x) 
      x<-vector(mode='list',2)))

summary(my.list)
     Length Class  Mode
[1,] 3      -none- list
[2,] 3      -none- list
[3,] 3      -none- list
[4,] 3      -none- list
[5,] 3      -none- list

summary(my.list[[1]])
     Length Class  Mode
[1,] 2      -none- list
[2,] 2      -none- list
[3,] 2      -none- list
于 2016-02-11T09:29:00.937 回答
1

设置一些参数:

window_front <- 100
horizon <- 10

创建一个空的嵌套列表:

sub_horizon <- vector("list", 27)

for (i in 1:length(sub_horizon)) {
  sub_horizon[[i]] <- vector("list", window_front)
  for (m in 1:length(sub_horizon[[i]])) {
    sub_horizon[[i]][[m]] <- vector("list", horizon)
  }
}
于 2016-10-21T10:56:06.470 回答
0

你的方法对我来说似乎有点复杂。您可能需要考虑使用查找表之类的东西,其中包含每个元素的案例组合:

例子

id <- seq(2*3*3*4*2*3*3) # a vector of identification values

#create a lookup table
lut <- cbind(id=id, expand.grid(lev1=seq(2), lev2=seq(3), lev3=seq(3), lev4=seq(4), lev5=seq(2), lev6=seq(3), lev7=seq(3)))

list.obj <- vector(mode="list", nrow(lut))

#optional addition of names
names(list.obj) <- paste(lut$lev1, lut$lev2, lut$lev3, lut$lev4, lut$lev5, lut$lev6, lut$lev7, sep=".")
head(list.obj)

#fill in list with data
for(i in seq(list.obj)){
    matching <- i #here you can have some sort of case matching for filling in elements of the list
    list.obj[[matching]] <- runif(10)
}
head(list.obj)

我相信这可能会让您在以后尝试为您感兴趣的案例挑选特定元素时变得更加轻松。

于 2013-07-10T09:52:27.353 回答