代码之家  ›  专栏  ›  技术社区  ›  Manuel Bickel

如何用空列表初始化data.table列并循环它?

  •  1
  • Manuel Bickel  · 技术社区  · 6 年前

    我想用一个 data.table 在一列中存储多个模型。我目前正在一个接一个地创建模型,并希望使用循环来存储它们。因此,我必须初始化一列空列表,该列可用于存储封装在 list . 我发现了一种适用于此目的的语法(见下文),但我认为可能有更优雅/简洁的版本(或完全不同的方法),也可能使用引用赋值。

    注意:由于创建每个单独的模型可能会占用大量的内存,所以我不能在一个调用中这样做,该调用会立即通过引用将所有模型分配给列,因此需要一个循环。至少,这是我的理解,如果我错了,请纠正我。

    ids = c(1,2)
    DT = data.table(id = ids, x = rep(list(), length(ids)))
    # assigning by reference returns an error (just for info)
    DT[1, x:= list(c(2,3))]
    # subsetting the list does what is desired
    for (i in ids) {
      DT[i, "x"][[1]] = list(rep(i, 2)*3)  
    }
    DT
    # id   x
    # 1:  1 3,3
    # 2:  2 6,6   
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   d125q    6 年前

    list

    > identical(rep(list(), 100), list())
    [1] TRUE
    

    你需要这么做

    > rep(list(list()), length(ids))
    [[1]]
    list()
    
    [[2]]
    list()
    

    相反。

    现在,对于任务:

    > DT = data.table(id = ids, x = rep(list(list()), length(ids)))
    > DT
       id      x
    1:  1 <list>
    2:  2 <list>
    > DT[1, x:=list(list(c(2, 3)))]  # notice the additional `list()`
    > DT
       id      x
    1:  1    2,3
    2:  2 <list>