【问题标题】:How to initialize a data.table column with empty lists and loop over it?如何用空列表初始化 data.table 列并循环它?
【发布时间】:2018-12-22 06:50:53
【问题描述】:

我想使用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   

【问题讨论】:

    标签: r list data.table


    【解决方案1】:

    您似乎缺少一堆嵌套的 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>
    

    【讨论】:

    • 你也可以像DT = data.table(id = ids, x = vector(length(ids), mode="list"))一样初始化,得到几乎相同的结果。还有将代表放入[],如list()[rep(1L, length(ids))]
    • 很好,我知道我遗漏了一些基本方面。感谢您对解决方案的解释和变体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2011-01-09
    • 2017-03-19
    • 2017-11-07
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多