首页 > 解决方案 > 在 R data.table 中初始化和复制列表列

问题描述

我经常需要存储复杂的对象,data.table所以我经常使用列表列。有时我需要用空列表初始化列,有时我需要将列表列复制到另一列。

起初这些似乎没有错:

# the example at https://stackoverflow.com/a/22536321/3718827
dt = data.table(id = 1:2, comment = vector("list", 2L))
# my usage need to add column to existing dt, not creating a data.table from scratch, so I modified it a little bit
dt <- data.table(id = 1:2)
dt[, comment := vector("list", nrow(dt))]
dt[1, comment := .(list(list(a = "a", b = "b")))]
dt[, edited_comment := comment]

但是,如果只有一行,则上面的代码不再起作用

> dt <- data.table(id = 1)
> dt[, comment := vector("list", nrow(dt))]
Warning message:
In `[.data.table`(dt, , `:=`(comment, vector("list", nrow(dt)))) :
  Adding new column 'comment' then assigning NULL (deleting it).
> dt[1, comment := .(list(list(a = "a", b = "b")))]
> dt[, edited_comment := comment]
Warning message:
In `[.data.table`(dt, , `:=`(edited_comment, comment)) :
  Supplied 2 items to be assigned to 1 items of column 'edited_comment' (1 unused)

我尝试了不同的语法,这似乎有效

> dt <- data.table(id = 1)
> dt[, comment := .(list(NULL))]
> dt[1, comment := .(list(list(a = "a", b = "b")))]
> dt[, edited_comment := list(comment)]

对于列表列初始化,也许我找到的示例代码仅用于data.table()调用。要添加列,则不应使用它。

对于复制一列,这种行为是可以理解的,但当它使用 nrow > 1 但不使用 nrow = 1 时有点令人惊讶。

我的问题是,该任务的正确语法是什么?

对于第一个版本的 nrow >1/=1 令人惊讶的行为差异,这是预期的行为还是错误?

标签: rdata.table

解决方案


推荐阅读