【问题标题】:R data.table assigning single-row list-type columnsR data.table 分配单行列表类型列
【发布时间】:2018-11-29 14:35:02
【问题描述】:

我发现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) 时,在第一种情况下是否没有额外的性能方面的操作?

【问题讨论】:

标签: r data.table


【解决方案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)

【讨论】:

  • 谢谢,这回答了我的问题如何统一案例(使用函数形式':=')。说当我们有 col := val 时自动换行到列表中并不能解释我的示例:如果 val 不是 已经是列表,则您可以换行,也许您可​​以将其添加到文档中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多