R data.table分配单行列表类型的列

时间:2018-11-29 14:35:02

标签: r data.table

我发现data.table的逻辑与以下两个操作不一致:

操作1:

df1<-data.table(a=c(1,2))
list1<-list(c(1,2), 1)
df1[,b:=list1]

#> df1
#   a   b
#1: 1 1,2
#2: 2   1

操作2:(data.table将单例列表视为我提供了一个向量)

df2<-data.table(a=c(1))
list2<-list(c(1,2))
df2[, b:=list2]
#Warning message:
#In `[.data.table`(df2, , `:=`(b, list2)) :
#  Supplied 2 items to be assigned to 1 items of column 'b' (1 unused)
#> df2
   a b
#1: 1 1

我希望在第二种情况下的输出是:

#   a   b
#1: 1 1,2

我可以统一两种情况:

df1[, b:=list(list1)]
df2[, b:=list(list2)]

这是最好的解决方案吗?有没有选择data.table来嵌套一个单例列表?在我使用b:=list(list1)的第一种情况下,是否没有性能方面的额外操作?

1 个答案:

答案 0 :(得分:1)

https://stackoverflow.com/a/54797914/2490497复制我的答案
我无法提出重复的建议,因为“此问题的答案没有被接受或接受 “。


这是一个很好的问题,涉及关于:=运算符的设计决策。

对于使用:=作为运算符的简单调用,例如col := val,我们决定将val自动包装到列表中。做出此决定是为了使用户更方便地分配单个列。

使用函数调用表单时,":="(col = val)不再将val包装到列表中。它已经是扩展形式。 :=充当list的别名,但会就地更新 。您始终可以通过将:=更改为list(或.)(如.(col = val))来检查更新的列。

即使使用:=作为运算符,您仍必须提供RHS作为正在创建2列以上的列,c("col1","col2") := list(val1, val2)的列表。