我找到了 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)
时,在第一种情况下是否没有额外的性能操作?
最佳答案
从 https://stackoverflow.com/a/54797914/2490497 复制我的回答
我不能建议重复,因为“这个问题没有被赞成或接受的答案
”。
这是一个很好的问题,涉及 :=
的设计决策运算符(operator)。
对于使用 :=
的简单调用作为运算符,如 col := val
,我们决定包装 val
自动进入列表。做出此决定是为了让用户更方便地分配单列。
当您使用函数调用形式时,":="(col = val)
我们不包装 val
不再列入名单。它已经是扩展形式。 :=
充当 list
的别名但就地更新。您可以随时通过更改 :=
来检查更新的列。进入 list
(或 .
)喜欢 .(col = val)
.
即使使用 :=
也不是这样作为运算符(operator),您仍然必须提供 RHS 作为您正在创建 2+ 列的列表,c("col1","col2") := list(val1, val2)
.
关于R data.table 分配单行列表类型列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541376/