Data.table: rbindlist(..., fill=TRUE) 应该在列表列中返回 NA_logical_ 吗?

创建于 2020-01-25  ·  6评论  ·  资料来源: Rdatatable/data.table

来自#4196:

填充列表列时,rbindlist 与所有其他列类型的行为不同,并返回 NULL 元素而不是 NA:

> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
      c1     c2
   <num> <list>
1:     0  1,2,3
2:     1   

预期的:

> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
      c1     c2
   <num> <list>
1:     0  1,2,3
2:     1  NA   

我们是否应该更改列表列的此行为以使用 NA 值填充行以匹配其他列类型的 fill=TRUE 行为?

non-atomic column question

最有用的评论

如果我们只是在文档中添加一个句子,说明在缺少列表列的情况下的行为会怎样:

fill 参数的当前条目:

TRUE 用 NA 填充缺失的列。 默认为假。 当为 TRUE 时,use.names 设置为 TRUE。

建议的:

TRUE 用 NA 填充缺失的列,或 NULL 用于缺失的列表列。 默认为假。 当为 TRUE 时,use.names 设置为 TRUE。

所有6条评论

如果我们想进行更改,则提供带有修复的 PR

目前的行为对我来说似乎很好。

> str(as.integer(NULL)[1L])
 int NA
> str(as.list(NULL)[1L])
List of 1
 $ : NULL

IMO 不应该是 NA,因为:

  • 它将类型从缺失字段(未定义)更改为逻辑向量
  • 它将长度从 0 长度更改为长度 1

我倾向于简的观点。 空元素的当前行为实际上是列表表示缺失的方式(没有任何对象指向)。 我们可以构建一个例子,其中列表的每一项都是一个逻辑向量,每一项都是一些计算的结果。 在这种情况下,可能需要表示 3 种不同的状态:长度 0 逻辑、长度 1 NA 逻辑和缺失计算。 如果长度 1 NA 逻辑用于丢失,则无法区分这 2 个。

改变打印方法就足够了吗? 而不是什么都不打印, NULL怎么样? 打印NA可能再次暗示长度为 1 NA 的逻辑,而NULL将是明确的,与基础 R 为空列表项打印的内容一致,并且会给出进一步的视觉提醒,即它是一个列表柱子。

也同意 w Jan,特别是关于长度 0 --> 长度 1。

我经常使用 lengths(x)>0 来按空列表列过滤行。

我们可以猜想把logical() 放在那里,但是logical() 比NULL 有什么优势吗?

如果我们只是在文档中添加一个句子,说明在缺少列表列的情况下的行为会怎样:

fill 参数的当前条目:

TRUE 用 NA 填充缺失的列。 默认为假。 当为 TRUE 时,use.names 设置为 TRUE。

建议的:

TRUE 用 NA 填充缺失的列,或 NULL 用于缺失的列表列。 默认为假。 当为 TRUE 时,use.names 设置为 TRUE。

文档更改看起来不错。 加上我建议的打印方法更改?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

symbalex picture symbalex  ·  3评论

arunsrinivasan picture arunsrinivasan  ·  3评论

jangorecki picture jangorecki  ·  3评论

st-pasha picture st-pasha  ·  3评论

rafapereirabr picture rafapereirabr  ·  3评论